使用条件变量进行线程间的同步

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,这时我们可以通过设置条件变量的时钟属性来避免这个问题。下面的例子展示了如何使用这个属性:

以上是关于使用条件变量进行线程间的同步的主要内容,如果未能解决你的问题,请参考以下文章

信号量,互斥锁,读写锁和条件变量的区别

嵌入式开发之hi3519---进程线程间的同步和互斥,条件变量信号了互斥锁等

线程同步

线程同步与互斥详解

(转载)Linux 多线程条件变量同步

C++ std::condition_variable 是什么 有什么用 条件变量 线程同步