linux多线程编程(四)

2019-10-14 12:57:31王冬梅

解锁互斥:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
参数:
     mutex互斥id
note:如果指定的互斥id已经被锁住那么对其解锁
释放互斥:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数:
     mutex互斥id
note:释放指定的mutex占用的资源。
函数pthread_mutex_init和pthread_mutex_destroy分别是互斥锁的构造函数和析构函数。

 二、多线程同步

1.互斥体

互斥量(mutex)相当于一把锁,可以保证以下三点:
◎原子性:如果一个线程锁定一个互斥量,那么临界区内的操作要么全部完成,要么一个也不执行。
◎惟一性:如果一个线程锁定一个互斥量,那么在它解除锁定之前,没有其他线程可以锁定这个互斥量。
◎非繁忙等待:如果一个线程已经锁定一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何CPU资源),直到第一个线程解除对这个互斥量的锁定为止。

2.条件变量

条件变量是一种可以使线程(不消耗CPU)等待某些事件发生的机制。某些线程可能守候着一个条件变量,直到某个其他的线程给这个条件变量发送一个信号,这时这些线程中的一个线程就会苏醒,处理这个事件。但条件变量不提供锁定,所以它必须与一个互斥量同时使用,提供访问这个环境变量时必要的锁定。
3.信号量
Dijkstra提出了信号量的概念,信号量是一种特殊的变量,只可以取正整数值,对这个正整数只能采取两种操作:P操作(代表等待,关操作)和V操作(代表信号,开操作)。
P/V操作定义如下(假设我们有一个信号量sem) :
P(sem):如果sem的值大于0,则sem减1;如果sem的值为0,则挂起该线程。
V(sem):如果有其它进程因等待sem而挂起,则让它恢复执行;如果没有线程等待sem而被挂起,则sem加上1。
信号集的创建与打开
int semget(key_t key,int nsems,int flag);
对信号量的操作
int semop(int semid,struct sembuf semoparray[],size_t nops);
对信号量的控制
int semctl(int semid,int semnum int cmd,union semun arg);
附:经典的生产者-消费者问题(Producer-Costomer)是一个著名的同步问题。