gpt4 book ai didi

c - pthread_kill 与 pthread_cond_signal 在特定点暂停/恢复线程

转载 作者:行者123 更新时间:2023-11-30 16:39:53 28 4
gpt4 key购买 nike

此请求与 PThreads 以及使用条件或信号来暂停/恢复连续循环工作线程有关。

不久前,我遇到了这个问题:

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

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

我的问题都是相关的:

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

最佳答案

我将尝试回答14点。

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

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

关于c - pthread_kill 与 pthread_cond_signal 在特定点暂停/恢复线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46880507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com