POSIX线程中的条件变量与互斥量 | 重归混沌的BLOG

POSIX线程中的条件变量与互斥量

在看到UNP第26章时发现对于linux下的线程模型还很不是非常了解. 翻到APUE的第11章, 发现POSIX线程中通用的两个线程交互与同步手段有互斥量和条件变量两种.

对于这两种同步手段我想了很久也没想到每种到底适用于哪些场景, 甚至于我觉得几乎mutex就够完成绝大部分线程同步功能了. 以前在写代码时都是自然而然的用出来了, 也从来没有认真总结过到底什么情况下使用Mutex, 什么下使用条件变量(类似Windows下的事件).

google到这篇文章终于豁然开朗. 其实问题很简单, 也许换个描述方式就更容易说明问题, Mutex是用来在线程内来保证操作的原子性, 可以称为同步手段. 而条件变量是用来线程间通信使用的. 如Mutex在某一线程Get之后, 从此这个Mutex就属于这个线程, 只有Get到这个Mutex的线程才能将其释放. 而条件变量则不然, 线程A设置过条件变量后, 线程B即可访问, 反之线程B设置条件变量之后线程A也可以访问. 因此多线程编码中当需要保证于某一操作的原子性时则使用Mutex, 当线程间需要相互通信时则需要使用条件变量.


在下班回来的路上, 大概回忆了一下代码中多线程的地方, 发现其实并非没有用到条件变量(Windows下的事件)的地方, 只是因为我都是顺手就写成while (flag == flase) sleep(x)这种查询的方式, 如果将查询换成条件变量之后, 此线程被唤醒的次数将大大降低对CPU时间的浪费将会更少.


1月14日补充:
条件变量只有在pthread_cond_wait进入sleep之后, pthread_cond_signal函数执行才能将pthread_cond_wait函数唤醒, 如果一个线程先执行pthread_cond_signal函数, 随后另一个线程执行到pthread_cond_wait时依然会被挂起. 这点与Windows下的Event并不相同, Windows下的Event不论是先于WaitForSingleObject去设置Event还是后于WaitForSingleObject, 只要Event被设置WaitForSingleObject都能正常返回.



发表评论