线程在pthread_cond_wait中时取消线程是否会导致它重新获取相关的互斥
Does cancelling a thread while its in a pthread_cond_wait cause it to reacquire the related mutex?
我正在看David R.Butenhof的教科书《用POSIX线程编程》中的代码,我发现了一个让我有点困惑的地方。
在代码中,为线程注册了一个清理处理程序。清理处理程序解锁该线程中的条件所使用的互斥对象。
对于一般的线程,当调用pthread_cond_wait时(相关的互斥锁被锁定),互斥锁在线程等待时被解锁——然后,当条件等待结束时,在返回(即,发生信号或广播)之前,它被重新获取。
既然在等待时condition_wait没有锁定互斥体,我会认为如果线程在等待时被取消,它仍然不会锁定互斥体——那么为什么清理处理程序需要释放它呢?
事实上,我认为解锁一个已经解锁的互斥对象实际上是一个错误,这让情况变得更糟。有人能告诉我你认为我在哪里感到困惑吗?
您正确地认为解锁已解锁的互斥对象是坏事™.
然而,当pthread_cond_wait()
是一个取消点时,接口保证在取消处理程序运行之前重新获取互斥。如果它没有做出这种保证,那么就很难知道互斥是否被持有。
有关详细信息,请参阅:规范。
相关文章:
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 互斥,Windows 10,c ++,在一个线程上获取,在另一个线程上发布
- 如何从其他线程 winapi 获取消息
- 有没有办法获取线程使用的内核?
- 多个线程之间的获取-释放内存顺序
- openmp 锁由同一线程重新获取,而另一个线程正在等待它
- C++线程获取每个循环的值
- 如何获取有关 NUMA 的线程信息
- 如何获取 systemc 线程的堆栈大小
- 如何获取正确的线程 ID 和值
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- 如何为 OpenMP 中任意数量的线程获取相同的并行化输出,以便 if-else,增量
- 在 C++11 中从多个线程获取值,而无需等待任何给定线程完成执行
- C++ 线程获取引用参数编译失败
- 根据从两个不同线程获取的时间戳匹配图像
- 从线程获取成员数据
- 正在从线程获取相机图像
- 主线程无法从工作线程获取信号
- QT线程:获取QObject::startTimer:计时器无法从另一个线程启动警告
- 如何从另一个线程获取指针