0

我让我的主进程发送pthread_cancel到另一个正在等待条件发生的线程cond_wait(&condition)。他们pthread_cancel说:延迟取消能力意味着取消将被延迟,直到线程下一次调用作为取消点的函数。但通常这些功能是阻塞功能。然后我的问题是线程仅在该线程被解除阻塞(在我的示例中通过广播或信号)后才取消,或者它会看到我当前在取消点阻塞然后取消我的线程?

4

2 回答 2

1

我不熟悉cond_wait,但我认为它来自另一个库,而不是通常使用的pthread_cond_wait

但是是的,如果一个线程在 a 中被阻塞pthread_cond_wait然后被取消,那么线程将被唤醒,重新获取它的互斥体,然后被取消。

因此,在取消某个条件下阻塞的线程时,需要牢记两点:

  1. 在调用pthread_cancel. 例如,如果线程 A 正在等待一个条件,而线程 B 锁定条件互斥锁,调用pthread_cancel然后pthread_join在解锁条件互斥锁之前,您将死锁。

  2. 安装清理处理程序(请参阅 参考资料pthread_cleanup_push)以在调用之前解锁条件互斥锁pthread_cond_wait- 否则您将取消线程并使互斥锁保持锁定状态。

但是,还要注意 pthread 条件变量实现已经/有一些错误 - 所以一定要使用最新的 glibc。

于 2013-03-26T17:50:04.533 回答
0

您可能想要使用 pthread_cond_wait 而不是 cond_wait。

如果您使用 pthread_cond_wait 并基于此来自 m​​an pthread_cond_wait(3)

条件等待(无论是否定时)是一个取消点。当线程的可取消启用状态设置为 PTHREAD_CANCEL_DEFERRED 时,在条件等待时对取消请求采取行动的副作用是在调用第一个取消清理处理程序之前(实际上)重新获取互斥锁。效果就像线程被解除阻塞,允许执行直到从调用 pthread_cond_timedwait() 或 pthread_cond_wait() 返回的点,但此时注意到取消请求,而不是返回到 pthread_cond_timedwait() 的调用者或 pthread_cond_wait(),启动线程取消活动,包括调用取消清理处理程序。

看起来线程将在 pthread_cond_wait 上取消,即使它当前被阻塞

或者您可以使用 pthread_setcanceltype 将取消类型设置为 ASYNCHRONOUS。见下面的评论

但就像大多数时候一样,最好的确定方法是使用测试代码进行尝试。

于 2013-03-26T17:35:29.300 回答