c ++ 11在信号处理程序中使用条件变量

时间:2015-07-20 16:03:55

标签: c++ c++11 signals posix

在信号处理程序中使用std::condition_variable::notify_one是否安全?例如:

enum State {
  DoNot,
  Do,
};
State state;
std::mutex mutex;

// worker thread
std::thread th = std::thread([]()
{
    std::unique_lock<std::mutex> lc(mutex);
    cv.wait(lc, []() { return state; });
});

//signal handler
void handler(int sig)
{
    if (sig == SOME_SIG)
    {
        std::unique_lock<std::mutex> lc(mutex);
        state = Do;
        cv.notify_one();
    }
}

1 个答案:

答案 0 :(得分:6)

C ++ 14标准草案N4296说:

  

[support.runtime] / 10 C和C ++语言的通用子集包含所有声明,定义和表达式   这可能出现在格式良好的C ++程序中,也可能出现在符合C的程序中。一个POF(“普通老   function“)是一个只使用来自这个公共子集的特性的函数,它不直接或间接地使用任何不是POF的函数,除了它可以使用普通的无锁原子操作...... 行为任何   除了用作C ++程序中的信号处理程序的POF之外的函数是实现定义的。

强调我的。