【问题标题】:pthread_kill vs pthread_cond_signal for pausing/resuming a thread on a specific pointpthread_kill 与 pthread_cond_signal 用于在特定点暂停/恢复线程
【发布时间】:2017-10-23 00:34:41
【问题描述】:

此请求是关于 PThreads 并使用条件或信号来暂停/恢复连续循环工作线程。

不久前,我遇到了这个:

https://stackoverflow.com/a/23945651/6421961

基本上,用户 johnnycrash 使用 sigwait() 让线程进入暂停状态(等待外部唤醒)并使用 pthread_kill(thread_id, USR1) 向线程发出信号醒来。他声称它比使用 mutex+condition 构造更快,而且它似乎不那么复杂。我正在开发一个软件,它确实需要一个线程休眠直到发出信号并在无限循环中工作后返回休眠(喂食者范式的食者)。 我正在使用它来让一个单独的线程等待工作线程的结束。在我当前的实现中,工作线程将它们的句柄添加到受互斥体保护的列表中,使用 pthread_kill 向等待线程发出信号,并使用 pthread_join 结束。

我的问题都是相关的:

  1. 实际使用 pthread_kill()+sigwait() 而不是 mutex+condition 的有效性如何?
  2. 如果这是一个可接受的解决方案,有哪些陷阱/竞争条件 应该知道吗?
  3. 使用 pthread_sigqueue() 代替 pthread_kill() 会更好吗?它真的能够捕获 sigwait() 未运行时发送的信号,并在调用 sigwait() 后立即处理它们吗?
  4. 最后一个问题,源自我发现的一些相互矛盾的信息:不同线程是否都因 sigwait() 而暂停,期望 USR1 能够独立发出信号,还是只有一个他们中的哪些人能够真正捕捉到信号,而不管是哪个信号发出的?

【问题讨论】:

  • 信号量呢?使用sem_post()/sem_wait() 比使用信号还要简单。
  • 我更新了我的问题以提供更准确的信息。与替代结构相比,信号量的效率如何?

标签: c multithreading pthreads signals mutex


【解决方案1】:

我会尽量回答点14

  1. pthread_kill() + sigqueue()mutex+condition 他们都有自己的目的。当您处理由多个线程使用的数据(即全局变量)时,在这种情况下mutex 更合适。但是,当您在等待外部事件(例如网络数据包)并希望根据该事件向您的线程发送信号时,pthread_kill() 更合适。

  2. 这取决于信号 (USR1) 的发送方式。如果它是使用pthread_kill()pthread_sigqueue() 发送的,您可以指定将该信号发送到哪个线程,唯一的区别在于pthread_sigqueue() - 您可以使用该信号发送附加信息。您还可以使用kill() 将信号发送到特定的 pid 或按组发送信号。因此,这在很大程度上取决于您的需求。

【讨论】:

  • 我一直在试图找到来源(实际上是stackoverflow上的另一个线程),有人断然表示pthread_kill并不真正关心它将信号发送到哪个线程,如果两个线程正在等待相同的信号,任何一个线程都可以捕获它,我觉得这很奇怪。我已经更新了我的问题,以反映对我想要实现的目标的更详细的解释。我希望为该用例使用最好的实现。
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 2015-02-21
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多