我正在处理一项多线程调度任务,其中涉及将线程添加到各种队列并选择合适的队列执行。
据我所知,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/