c++ - linux下的Boost Semaphores和EINTR返回码

标签 c++ linux boost synchronization semaphore

在 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/

相关文章:

linux - 为什么这个示例脚本在 token 附近不断输出错误?

c++ - 如何调用 boost::variant 的特定构造函数

c++ - 指向非静态成员函数的指针的值

c++ - 指向类成员函数的指针作为外部函数的参数

linux - Linux中分页的最大进程数

Linux reboot() 系统调用 : why it calls do_exit(0) after kernel_halt()?

c++ - 当多个高优先级线程在多个内核上运行时,Linux 内核无响应

c++ - 我们如何阅读下面的语句?

C++ Linux : error: ‘move’ is not a member of ‘std’ how to get around it?

c++ boost spirit attr_cast 不调用预期的 tranform_attribute