线程在pthread_cond_wait中时取消线程是否会导致它重新获取相关的互斥

Does cancelling a thread while its in a pthread_cond_wait cause it to reacquire the related mutex?

本文关键字:线程 获取 新获取 wait cond pthread 是否 取消      更新时间:2023-10-16

我正在看David R.Butenhof的教科书《用POSIX线程编程》中的代码,我发现了一个让我有点困惑的地方。

在代码中,为线程注册了一个清理处理程序。清理处理程序解锁该线程中的条件所使用的互斥对象。

对于一般的线程,当调用pthread_cond_wait时(相关的互斥锁被锁定),互斥锁在线程等待时被解锁——然后,当条件等待结束时,在返回(即,发生信号或广播)之前,它被重新获取。

既然在等待时condition_wait没有锁定互斥体,我会认为如果线程在等待时被取消,它仍然不会锁定互斥体——那么为什么清理处理程序需要释放它呢?

事实上,我认为解锁一个已经解锁的互斥对象实际上是一个错误,这让情况变得更糟。有人能告诉我你认为我在哪里感到困惑吗?

您正确地认为解锁已解锁的互斥对象是坏事™.

然而,当pthread_cond_wait()是一个取消点时,接口保证在取消处理程序运行之前重新获取互斥。如果它没有做出这种保证,那么就很难知道互斥是否被持有。

有关详细信息,请参阅:规范。