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

时间:2018-03-07 04:36:24

标签: c++ linux multithreading pthreads

我正在进行多线程调度分配,其中包括将线程添加到各种队列并选择要执行的相应队列。

pthread_cond_signal(& condition)命令与我所知的完全不同步;它只是被抛入内存中,第一个使用适当的pthread_cond_wait()查找它的线程将使用它。

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

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

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

etc.

我想将一个信号专门发送到线程,其id与矢量的相应元素相匹配。即算法将是:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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