互斥量、读写锁令共享资源在某一时期的独享使用成为可能,而条件变量则更加在乎在这一基础之上的协同工作。
条件变量下的信号机制
与原先讨论过的在各个进程间传递的那种变量不同,条件变量下的信号主要面向”进程内的“各项信号。
同时,条件变量下的信号含义由程序员决定,因为条件变量就是一个单纯的标记值。
我们的系统在这之中承担的责任有:
条件变量的注册
pthread_cond_t 类型用于描述一个条件变量,我们可以用它结合常值 PTHREAD_COND_INITIALIZER,完成一个条件变量的静态初始化。
而更进一步的设置,可以借助 pthread_cond_init 函数进行完成。
值的注意的事情在于,在标准的文档里面指出:
In cases where default condition variable attributes are appropriate, the macro PTHREAD_COND_INITIALIZER can be used to initialize condition variables that are statically allocated. **The effect shall be equivalent to dynamic initialization by a call to pthread_cond_init() with parameter attr specified as NULL, except that no error checks are performed. **
换而言之就是说,直接设置变量为 PTHREAD_COND_INITIALIZER 相当于调用了 pthread_cond_init 中的默认选项,且没有做错误检查。
条件变量的信号传达与信号传达
这份工作实际上就是同一个事情的一体两面,我们要看到的事情爱与,对于那些没有获取到共享资源的线程而言,他们需要调用 pthread_cond_wait 函数进行等待,而对于那些已经获取到了共享资源的线程而言,在它们完成了自己的工作之后,它们需要调用 pthread_cond_signal(单独面向某一个线程发送)或 pthread_cond_broadcase(面向全部在等待的线程发送)进行通知。
条件变量的释放
在我们完成对条件变量的使用之后,就应当使用 pthread_cond_destory 函数将其销毁。
自旋锁
与采用休眠方式(事到临头才进行通知)的互斥量锁不同,自旋锁采用忙等待方案作为锁的实现方案。
屏障
与只能让一对线程做接力跑的 pthread_join 函数不同,屏障允许让许多线程再次站到同一条起跑线上面去。