在 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 信号量手册说:
ERRORS
EINTR The call was interrupted by a signal handler; see signal(7).
如果我将 kill 发送到等待线程,boost 信号量会抛出异常,我说得对吗?如果是这样,您如何处理这种情况?
最佳答案
在我看来,这可能是 Boost.Interprocess 中的一个错误。请向开发人员报告,如果这是故意的,至少他们能够提供理由。
评论上面评论中的信号管理建议。的确,典型的多线程应用程序应该屏蔽掉不打算由线程处理的信号,只留下一个线程来处理信号。但是,这不是强制性规则。
首先,辅助线程可以由不在内部处理信号的库生成,将其留给应用程序。可能会在这些线程中调用信号处理程序。
其次,一些信号可能有意不被屏蔽以捕获与该特定线程相关的事件。例如,可以为 SIGSEGV 注册一个处理程序来检测段错误。该处理程序将在有问题的线程中调用,应用程序理论上可以处理该错误。同样,SIGUSR1 或 SIGUSR2 可用于将应用程序定义的事件发送给特定线程。
底线是,即使一个设计良好的应用程序应该将信号处理提取到一个单独的线程中,库也不应该假设并准备好它不会。在任何情况下,抛出 EINTR 看起来都不是正确的行为。
关于c++ - linux下的Boost Semaphores和EINTR返回码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29468043/