第一次发blog,若有错误请谅解和指导,谢谢!!!!
好了,我们回归正题:
随着时代的发展,线程应运而生。这是为什么呢?这是因为我们要进一步减少CPU的空转时间,支持多处理器以及减少上下文切换的开销,那么进程在变化过程出现了‘线程’的概念。线程是进程内独立的一条运行路线,是内核调度的最小单元,也称为轻量级进程。线程由于高效性和可操作性好,在嵌入式开发系统中用的非常广泛。
1、互斥:
即为同时只允许一个访问者对临界资源的访问,具有唯一性和排他性,但是无法限制访问的先后顺序。
按照我的话说就是我在用这段程序别人不能打断我,但是没有先后的顺序。互斥的目的:是保证数据操作的完整性而且在任何时刻只能有一个线程访问。
2、同步:
是在互斥的基础上,通过信号量来实现限制访问者的先后顺序,即为对临界资源的有序访问。
比如说以下这个程序(已加上互斥锁pthread_mutex):
#include <stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<sys/types.h>
#include<string.h>
pthread_mutex_t mutex;
void *A_thread(void *arg)
{
int i = 3;
pthread_mutex_lock(&mutex);
while(i >=1)
{
printf(" AAAAAAAAAA\n");
sleep(1);
i--;
}
pthread_mutex_unlock(&mutex);
}
void *B_thread(void *arg)
{
int i = 3;
pthread_mutex_lock(&mutex);
while(i >=1){
printf(" BBBBBBBBBB\n");
sleep(1);
i--;
}
pthread_mutex_unlock(&mutex);
}
int main(int argc, char **argv)
{
pthread_t thread1,thread2;
pthread_mutex_init(&mutex,NULL);
if(pthread_create(&thread1, NULL, A_thread, NULL) <0)
{
perror(" A fail to pthread_creat");
exit(-1);
}
if(pthread_create(&thread2, NULL, B_thread, NULL) <0)
{
printf("B fail to pthread_creat ");
exit(-1);
}
if(pthread_join(thread1, NULL) < 0)
{
perror("pthread_join ");
exit(-1);
}
if(pthread_join(thread2, NULL) < 0)
{
perror("pthread_join");
exit(-1);
}
return 0;
}
在输出界面上可能是:
AAAAAAAAAA
BBBBBBBBBB
AAAAAAAAAA
BBBBBBBBBB
AAAAAAAAAA
BBBBBBBBBB
也有可能是:
BBBBBBBBBB
AAAAAAAAAA
BBBBBBBBBB
AAAAAAAAAA
BBBBBBBBBB
AAAAAAAAAA
在加上互斥锁的话就只能是这样:
AAAAAAAAAA BBBBBBBBBB
AAAAAAAAAA BBBBBBBBBB
AAAAAAAAAA 或者 BBBBBBBBBB
BBBBBBBBBB AAAAAAAAAA
BBBBBBBBBB AAAAAAAAAA
BBBBBBBBBB AAAAAAAAAA
在加上互斥锁的话那么临界资源在运行时是不会被打断的!
同步也举个例子吧,
EG:
void fun1(){
sem_wait(&sem1)
∶1
sem_post(&sem2)
}
void fun2(){
sem_wait(&sem2)
∶2
sem_post(&sem1)
}
∶
先对 fun1 进行访问时,其他的线程不能打断或者访问,再对 fun2 进行访问。