使用条件变量进行线程间的同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用条件变量进行线程间的同步相关的知识,希望对你有一定的参考价值。
参考技术A先看一下APUE第三版对于条件变量的说明:
条件变量是另一种线程同步机制,它为线程间共享的对象提供了同步的方法。当条件变量配合互斥锁(Mutex)使用时,允许多个线程处在一种自由等待任意条件发生的状态。
条件变量自身由互斥锁(Mutex)保护。线程必须在修改条件状态之前先对其上锁,其他线程不会在获取锁之前被通知到其状态变化,因为只有获取到锁才可以计算条件。
条件变量的数据类型是 pthread_cond_t ,条件变量属性的类型是 pthread_condattr_t ,它们都包含在头文件<pthread.h>中。
条件变量使用之前必须初始化,有两种方法:
需要释放条件变量时,使用pthread_cond_destroy即可。
调用phread_cond_wait或pthread_cond_timewait(以下简称wait函数)可以使当前线程等待某一条件的发生。两者的区别在于后者可以指定等待时间。
调用wait函数时,系统使调用线程进入等待状态后 释放锁 (所以我们必须先加锁后调用wait函数)。在这一步操作中的检查条件和进入等待是 原子操作 ,所以线程不会错过条件的变化。当wait函数返回时,mutex会 再次被加锁 。
其中pthread_cond_timewait中用到的timespec结构定义如下:
需要注意的是,timespec是一个绝对时间,所以在使用前我们需要先取得当前时间,再加上等待时间。例如下面这样:
如果时间到了还没有等到条件变化,函数会对mutex重新加锁并返回一个ETIMEOUT的错误。
当wait函数返回成功时, 需要重新检查条件 ,因为条件有可能已经被其他线程修改。
当条件满足时,可以用这两个函数用来通知其他线程。
pthread_cond_signal会唤醒至少一个等待的线程,而pthread_cond_broadcast会唤醒所有等待的线程。必须注意的是:我们 必须在状态发生变化之后再发送信号给其他线程 。
条件变量的数据类型是 pthread_cond_t ,它主要有两种属性:
设置进程间共享属性:
设置时钟属性:
pthread_cond_timewait函数用于在等待条件变量时提供超时功能,不过该函数的超时时间是一个绝对时间。默认使用系统时间,这意味着若修改系统时间,那么超时就不准确:有可能提前返回,也可能要几年才返回。这在某些情况下会导致bug,这时我们可以通过设置条件变量的时钟属性来避免这个问题。下面的例子展示了如何使用这个属性:
以上是关于使用条件变量进行线程间的同步的主要内容,如果未能解决你的问题,请参考以下文章