1)线程的同步指的是在一个进程中线程之间按照约定同步完成一个事件。由信号量来决定线程是该运行还是阻塞。
线程间的同步依靠P/V操作来完成,其中信号量是一个受保护的量,只能通过三种操作来访问:初始化,P操作(申请资源,此时P下面的信号量是处于等待状态,只有在V操作完成后,才会执行,所以P操作一般使用wait函数)和V操作(释放资源,只有V之前的指令执行完,才可以执行下面的指令,所以使用post函数)。
下面是同步的一般函数形式:
/* * #include * int sem_init(sem_t *sem,int pshared,unsigned int value) * * sem:初始化信号量 * pshared:信号量的共享范围(0 一般表示线程间的使用,非零:表示进程间的使用) *value:信号量的初始值 *#include *int sem_wait (sem_t *sem) * sem 表示要等到的信号量//成功返回0失败返回-1 * *int sem_wait(sem_t *sem) */ int main() { char buf[60]; sem_t sem; void *function(void *arg) pthread_t thread; if (sem_init(&sem,0,0) < 0){ //这里设置信号量是零, // 就是线程抢到CPU也必须等待 perror("sem_init"); exit(-1); } if (pthread_create(&thread,NULL,function,NULL) < 0){ perror("create"); exit(-1); } do { fget(buf,sizeof(buf),stdin); sem_post(&sem); }while(strncmp(buf,"quit",4) != 0); return 0; } void *function(void *arg) { while(1){ sem_wait(&sem); printf("you enter %d character \n",strlen(buf)-1); } }
2)线程间的互斥是为了保护线程共享数据的完整性,当几个线程共享一条数据或者多组数据时,并改变了数据的值,可是后面的线程还需原来的值,此时我们就需要通过线程间的互斥来保证共享区数据的完整性。
这里会提到互斥锁,其主要是用来保护临界资源的,每个临界资源都由一个互斥锁来保护的,任何时刻最多只能有一个线程可以访问该资源,线程必须先获得互斥锁才可以访问临界资源,没有获得互斥锁的线程则处于等待阻塞的状态。
互斥锁的一般形式:
/* * #include * int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr) * mutex 创建互斥锁 * attr互斥锁的属性,在这里一般赋NULL * * int pthread_mutex_lock(pthread_mutex_t *mutex) 表示申请互斥锁 * * int pthread_mutex_unlock(pthread_mutex_t *mutex) 表示释放互斥锁 * */ //一般形式 pthread_mutex_t mutex; pthread_mutex_lock(&mutex) pthread_mutex_unlock(&mutex)