【发布时间】: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 结束。
我的问题都是相关的:
- 实际使用 pthread_kill()+sigwait() 而不是 mutex+condition 的有效性如何?
- 如果这是一个可接受的解决方案,有哪些陷阱/竞争条件 应该知道吗?
- 使用 pthread_sigqueue() 代替 pthread_kill() 会更好吗?它真的能够捕获 sigwait() 未运行时发送的信号,并在调用 sigwait() 后立即处理它们吗?
- 最后一个问题,源自我发现的一些相互矛盾的信息:不同线程是否都因 sigwait() 而暂停,期望 USR1 能够独立发出信号,还是只有一个他们中的哪些人能够真正捕捉到信号,而不管是哪个信号发出的?
【问题讨论】:
-
信号量呢?使用
sem_post()/sem_wait()比使用信号还要简单。 -
我更新了我的问题以提供更准确的信息。与替代结构相比,信号量的效率如何?
标签: c multithreading pthreads signals mutex