我正在看教科书中的代码:David R. Butenhof用POSIX线程编程,我遇到了一个让我有些困惑的地方。
在代码中,为线程注册了清理处理程序。清理处理程序解锁该线程中条件使用的互斥锁。
使用genereal中的线程,当调用pthread_cond_wait时(相关的互斥锁应该被锁定),当线程等待时互斥锁被解锁 - 然后在条件等待结束之前重新获取它,然后返回(即信号或广播发生了。)
因为在等待时,condition_wait没有锁定互斥锁,我会认为如果一个线程在等待时被取消,它仍然没有锁定该互斥锁 - 那么为什么清理处理程序需要释放它?
事实上,我认为解锁已经解锁的互斥锁实际上是一个错误,使情况变得更糟。有人能告诉我你认为我在哪里感到困惑吗?
答案 0 :(得分:3)
关于解锁已经解锁为Bad Thing™的互斥锁,你是正确的。
但是,虽然pthread_cond_wait()
是取消点,但接口可确保在取消处理程序运行之前重新获取互斥锁。如果它没有做出这种保证,那么很难知道互斥锁是否被保留。
有关详细信息,请参阅:The specification。