是否可以向特定的 pthread ID 发送信号?

Posted

技术标签:

【中文标题】是否可以向特定的 pthread ID 发送信号?【英文标题】:Is It Possible to Send a Signal to a Specific pthread ID? 【发布时间】:2018-03-07 04:36:24 【问题描述】:

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

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

但是,假设我有一个在创建线程时推送的线程 ID 向量,即:

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

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

etc.

我想专门向线程发送一个信号,其 id 与向量的适当元素相匹配。 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

有什么方法可以执行上述操作,或者有一些公认的标准可以达到相同的结果吗?

【问题讨论】:

为什么不将特定于每个线程的条件与线程 ID 一起存储? threadVector1[0].threadID = 3061099328; threadVector1[0].condition = ...; 我不确定 linux 和 pthread,但我怀疑如果您使用的是 condition_variablestd::threadatomic<bool>,您可以使用一个 condition_variablebool per线程,并这样做。因此,您将创建 10 个线程,并为每个线程创建一个 condition_variable / bool @Bruno 我生成这些线程的原始方式是 for (i @MMMMCK 您不需要动态变量名。制作线程列表和相应的条件变量列表。给线程i条件变量i @MMMMMCK,我建议定义一个结构。伪代码:struct thread_id_t threadID; pthread_cond_t condition; 并将其分配给每个 threadVectorX 项... 【参考方案1】:

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

您可以使用 cmets 中提出的“多条件变量”解决方案。但我对此类问题的首选解决方案是管道或套接字对。让执行唤醒的线程向管道写入一些内容(如单个字节),以便相应的线程发出信号。

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

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

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

【讨论】:

第二。使用 ZeroMQ 代替套接字或管道对也很值得一看。 ZeroMQ 将套接字的概念抽象为更强大的东西。 “模式”可能特别有用,并且远远超出了使用直接 tcp/unix 套接字或管道对所能做的事情。此外,ZeroMQ“套接字”实际上可以通过 tcp、ipc 或 inproc 连接;后者很有趣,因为它纯粹是在进程内实现的(共享内存、信号量),所以速度非常快。从程序员的角度来看,tcp、ipc 和 inproc 的行为都是一样的。

以上是关于是否可以向特定的 pthread ID 发送信号?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从另一个进程向线程发送信号?

Unix系统编程()检查进程的存在

在信号句柄中使用 pthread_cond_wait 的 Pthread 被阻塞

Unix系统编程()发送信号的其他方式:raise和killpg

如何向 Qt 中 QThread 类的特定对象发出信号?

在 Python Discord Bot 中按名称而不是 ID 向特定文本通道发送消息