c++ - 是否可以向特定 pthread ID 发送信号?

标签 c++ linux multithreading pthreads

我正在处理一项多线程调度任务,其中涉及将线程添加到各种队列并选择合适的队列执行。

据我所知,pthread_cond_signal(&condition) 命令是完全异步的;它只是被扔进内存,第一个使用适当的 pthread_cond_wait() 找到它的线程将使用它。

但是,假设我有一个线程 ID vector ,这些线程 ID 在创建线程时被推送,即:

threadIDVector1[0] = 3061099328
threadIDVector1[1] = 3077884736
...

threadIDVector2[0] = 3294747394
threadIDVector2[1] = 3384567393
...

etc.

我想专门向线程发送一个信号,该线程的 id 与 vector 的适当元素相匹配。 IE。该算法将是:

While (at least one threadVector is non-empty):
    Look at the first element in each vector
    Select the appropriate one to signal by some criteria
    Send a signal to ONLY that thread
    Complete the thread and remove from threadIDVectorX

是否有某种方法可以执行上述操作,或者是否有一些公认的标准来实现相同的结果?

最佳答案

无法向特定线程“发送”信号,也无法知道操作系统将唤醒众多线程中的哪个线程。它完全是不确定的。

您可以使用评论中建议的“多条件变量”解决方案。但我更喜欢这样的解决方案是管道或套接字对。让执行唤醒的线程向管道写入一些内容(如单个字节),以便相应的线程向其发出信号。

这在我的书中有很多好处。首先,它允许双向通信。您问题末尾的伪代码循环似乎也想从列表中删除一个已完成的线程,因此您需要知道该线程何时完成。您可以有另一个 CV,或者您可以让完成线程在退出之前将一个字节写回管理器对象。我觉得容易多了。

它还允许您在阻塞或非阻塞 I/O 之间进行选择,或者通过 select(2)epoll(2) 使用同步多路复用。如果您没有退出工作线程,而是想重用它们,则通知线程需要知道它们何时准备好进行更多工作。同样,CV 在这里会很好,但是文件描述符方法允许通知程序在单个 select(2) 调用中等待 所有 工作线程。

最后一件事是我发现文件更简单。 pthreads 非常复杂,多线程已经很难做到正确。我发现文件在多线程上下文中更易于管理和推理,从而更容易避免锁定或崩溃。

关于c++ - 是否可以向特定 pthread ID 发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49144221/

相关文章:

c++ - 从内存中的 SVG 内容创建 QIcon

linux - 在 AWK 中运行命令

android - 在退出其线程之前将最后一个任务安全地发布到Handler

vb.net 更新进度条多线程

c++ - 运行时检查失败 #2 - 变量 'RL' 周围的堆栈已损坏

c++ - 为什么 CRTP 中的沮丧定义行为

c++ - 将任何迭代器转换为随机访问迭代器的适配器

linux - 如何使用 bash 脚本检查参数数量?

linux - 如何在适用于 cPanel 或 CentOS 的 VPS 上安装 PDFTK?

c# - 即使我没有同时运行多个东西,也会在长时间的过程发生时卡住表格