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

标签 c linux condition-variable

这个问题来自 Breaking a condition variable deadlock .许多线程可能正在等待一个条件变量,我只需要向一个特定的线程发出信号,比如线程 1 并杀死它,因为它是死锁场景的参与者。有没有一种方法可以让我在很多线程中仅发出一个特定线程的信号。

非常感谢您的帮助

谢谢

一个编辑;尊重 Nemo 的评论。我知道这是个坏主意。但是,有没有办法做到这一点

最佳答案

您可以使用延迟取消点。在您的线程中,使用 pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldstate);(这是默认设置,但明确无误);然后使用 pthread_setcancelstate 禁用取消,除非您希望取消的条件变量等待。请确保使用 pthread_cleanup_push 设置取消清理处理程序;这不会很好地与 RAII 一起玩。

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

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

关于c - 在许多等待条件变量的线程中向特定线程发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921627/

相关文章:

将 C 变量的内容复制到寄存器 (GCC)

linux - 如何为 buildbot 用户设置 SSH key

linux - 启用 Systemd 的服务不再在启动时启动

c++ - C/C++,你如何在 CLI 中为下载进度编码? Linux

Python 条件变量超时

c++ - 这是使用没有互斥量的条件变量的安全方法吗

c - 卡在线程问题上

c - 将结构添加到列表并获得正确的输出

消费者-生产者。没有错误。有时工作。为什么?

c - 在 C 中读取具有特定编码的文件?