c -在许多等待条件变量的线程中给一个特定的线程发信号



这个问题来自于打破条件变量死锁。许多线程可能正在等待一个条件变量,我需要只通知一个特定的线程,比如线程1,并杀死它,因为它是死锁场景的参与者。有没有一种方法,我可以信号只是一个特定的线程中的一个批次。

我很感激你的帮助

感谢

编辑;尊重尼莫的意见。我知道这是个坏主意。但是有没有办法

您可以使用延迟取消点。在你的线程中,使用pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldstate);(这是默认值,但明确一点也无妨);然后使用pthread_setcancelstate禁用取消,除非超过您想要取消的条件变量等待。确保使用pthread_cleanup_push来设置取消清理处理程序;这将不能很好地与RAII。

现在你可以pthread_cancel你的线程。取消清理处理程序按注册的相反顺序执行,调用TLS数据析构函数,线程退出(不从条件变量wait返回)。

当然,这是一个相当丑陋的设计。理想情况下,你应该完全避免僵局;如果这是不可能的,如果是我,我会安排一次只有一个线程阻塞在单个cvar上,并基于这些cvar构建一个更高级别(显式服务员列表)结构,以便处理多个服务员,同时仍然允许线程可单独寻址。

只需编写代码来完成您所需要的。没有捷径,因为条件变量不提供这种行为。把它写下来。这没什么难的。例如,您可以设置一个特殊的标志,唤醒在条件变量上阻塞的所有线程,然后对线程进行编码以检查标志,以确定是否应该返回睡眠状态。

最新更新