我正在看 David R. Butenhof 教科书上的代码:Programming With POSIX Threads,我发现了一个让我有点困惑的地方。
在代码中,为线程注册了一个清理处理程序。清理处理程序解锁该线程内的条件使用的互斥锁。
一般来说,对于线程来说,当调用 pthread_cond_wait 时(相关互斥体按应有的方式锁定),互斥体在线程等待时被解锁 - 然后在条件等待结束时、在返回之前重新获取互斥体(即,发生信号或广播)。因为在等待时,condition_wait没有锁定互斥体,所以我想如果一个线程在等待时被取消,它仍然不会锁定该互斥体 - 那么为什么清理处理程序需要释放它?
事实上,我认为解锁已经解锁的互斥锁实际上是一个错误,这使得情况变得更糟。有人可以告诉我你认为我困惑的地方吗?
最佳答案
关于解锁已解锁的互斥体是一件坏事™,您是正确的。
但是,虽然 pthread_cond_wait() 是取消点,但该接口(interface)保证在取消处理程序运行之前重新获取互斥锁。如果它没有做出这样的保证,则很难知道互斥体是否被持有。
参见:The specification了解详情。
关于c++ - 在 pthread_cond_wait 中取消线程是否会导致它重新获取相关的互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979655/