【发布时间】:2015-04-06 08:48:23
【问题描述】:
在 boost(我使用 1.54.0)中,我看到了 posix 信号等待的实现:
inline void semaphore_wait(sem_t *handle)
{
int ret = sem_wait(handle);
if(ret != 0){
throw interprocess_exception(system_error_code());
}
}
posix 信号量手册说:
错误
EINTR The call was interrupted by a signal handler; see signal(7).
如果我将 kill 发送到等待线程,我对提升信号量抛出异常是否正确?如果是这样,您如何处理这种情况?
【问题讨论】:
-
除非线程被设计为处理它,否则不要向线程发送终止。
-
@DavidSchwartz 在一般情况下,我无法确定它是否为它设计。当您在连接中发送获得 RST 的东西时,我也可以获得类似 SIGPIPE 的东西,这对于 TCP 应用程序很常见。
-
如果您不知道线程将如何处理信号,您为什么要将该信号发送给线程?!向线程发送信号的唯一原因是因为您知道该线程在收到该信号时要做什么,并且您希望它这样做。线程必须合作。
-
@DavidSchwartz 好的,哪个线程处理进程范围的信号 SIGHUP 或 SIGTERM?据我了解,任何不掩盖它的东西。
-
没错。进程不希望处理这些信号的线程应该屏蔽它们。进程确实希望处理这些信号的线程不应该。如何处理进程范围的信号是一个进程级别的实现决策。
标签: c++ linux boost synchronization semaphore