条件变量 pthread_cond
来源:互联网 发布:hexdump windows 编辑:程序博客网 时间:2024/06/04 23:28
[APUE] 条件变量 pthread_cond
早起翻APUE,查缺补漏。书接上回,看到“条件变量”,七八年前看过,有点模糊的印象。不过还是有些地方解释不过去,看来我当年也只是“看了”但是“没理解”。
根据后面的示例代码,enqueue_msg()和process_msg()因为都调用pthread_mutex_lock要锁住互斥量mutex,那它们应该是互斥的关系。则,若process_msg()先运行,并wait在pthread_cond_wait(),这时候该函数一直锁住着mutex,其它比如enqueue_msg()没法去获得这个mutex以运行。process_msg()等待着队列非空才继续,然后才会解锁mutex,而enqueue_msg()则可以使队列非空,但是现在缺没法获得mutex以运行,这样企不是死锁了。
Google了一下,在“MemoryGarden’s Blog”,用开头的一句话,把这事点明白了。“普通的 mutex 只允许一个线程进入临界区,就是拿到mutex这把锁的线程,而cond允许多个线程同时进入临界区,由它来控制,在某些条件成立的时候,来唤醒其中一个等待着的线程,或者是唤醒所有等待着的线程。”。再结合APUE书上所说,就可以整理出思路了:
1. 通常情况下pthread_mutex_lock()互斥排他性的锁住mutex。即有一个线程锁住了mutex,则其它线程都得等着前面那个线程解锁才行。
2. 在使用cond的时候,上面条目1所述不变,pthread_mutex_lock()依然是互斥排他的。不过pthread_cond_wait()让整体代码和流程看起来是打破了pthread_mutex_lock()的互斥性,其实是pthread_cond_wait()隐藏了一些实现细节。
pthread_cond_wait()有目的性的接收mutex作为参数,其实是调用pthread_cond_wait的时候做了两件事,一是将调用线程放到等待队列的线程列表上,二是对互斥量mutex解锁。然后,当wait_timeout或pthread_cond_signal()唤醒等待条件的线程时,使pthread_cond_wait()函数返回,返回的时候又把互斥量mutex给锁上了(当然是在内部偷偷实现的)。pthread_cond_wait()偷摸的内地里背后里悄悄的做了解锁mutex和又锁定mutex的过程,给调用者一种它打破pthread_mutex_lock()互斥性的错觉。
- pthread_cond 线程条件变量
- 条件变量 pthread_cond
- Linux 条件变量的使用pthread_cond
- 详解linux互斥锁 pthread_mutex和条件变量pthread_cond
- POSIX---互斥锁(pthread_mutex)和条件变量(pthread_cond)的用法
- pthread_cond
- pthread_cond
- 线程互斥和条件同步,pthread_mutex和pthread_cond
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 创建对象在内存中,程序的执行过程
- v4l2
- java.sql.SQLException: Java exception: ': java.nio.channels.ClosedByInterruptException'.
- Solr4.5.1+tomcat8.0安装配置
- UNIX中select的实现和以及字节数组来实现位操作
- 条件变量 pthread_cond
- PCA的数学原理
- Codeforces Round #242 (Div. 2)
- 简约至上 C Plus Plus 的list 容器的学习
- 在MySQL中定义外键(转)
- 彻底解决CHECK_NRPE: Error - Could not complete SSL handshake.
- windows copy命令详解
- android Activity和Fragment生命周期实践
- 两句话治疗颈椎病