c++ - 在 pthread_cond_wait 中取消线程是否会导致它重新获取相关的互斥锁?

标签 c++ multithreading posix

我正在看 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/

相关文章:

c++ - 通过 posix 套接字发送文件时的零窗口

macos - 在 Mac OS X 上打开磁盘设备文件以进行写访问

c++ - 如何为 windows 编写 posix waitpid() 模拟?

c++ - 好友类 'has no member named...'

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c# - 如何在 C# 中使用线程来加快工作?

java - Spring 注入(inject)的 bean 线程安全

multithreading - 如何使信号量超时

android - 如何以纯 Android Studio 方式编译我的 C++ 库(无需自行指定任何 .mk 文件)

c++ - QT从资源/指定路径加载dll