是否可以向特定的 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_variable
、std::thread
和 atomic<bool>
,您可以使用一个 condition_variable
或 bool
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 发送信号?的主要内容,如果未能解决你的问题,请参考以下文章
在信号句柄中使用 pthread_cond_wait 的 Pthread 被阻塞