linux下c语言开发多线程
关于条件变量和互斥锁会一起使用的一些注意点
注意 1:mutex 互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP)。在调用 pthread_cond_wait()前必须由本线程加锁 pthread_mutex_lock()。在更新条件等待队列以前,mutex 保持锁定状态。在线程挂起进入等待前解锁。
注意 2:在条件满足从而离开 pthread_cond_wait() 之前,mutex 将被重新加锁,以与进入
pthread_cond_wait()前的加锁动作对应。也就是说在做 pthread_cond_wait 之前,往往要用 pthread_mutex_lock 进行加锁,而调 pthread_cond_wait 函 数 会 将 锁 解 开 , 然 后 将 线 程 挂 起 阻 塞 。 直 到 条 件 被pthread_cond_signal 激发,该函数内部又会将锁状态恢复为锁定状态,最后再用pthread_mutex_unlock 进行解锁。
注意 3:
pthread_cond_wait() 和 pthread_cond_timedwait()都被实现为取消点,也就是说如果
pthread_cond_wait()被取消,则退出阻塞,然后将锁状态恢复,然后当前线程就会终止。即
互斥锁又恢复锁定状态,然而当前线程已经被取消掉,那么这个互斥锁就不会被解开了,此
时锁得不到释放,就会造成死锁,因而需要在线程退出前为其解锁。