2015-07-20 49 views
7

在信号处理程序中使用std::condition_variable::notify_one安全吗?例如:C++ 11在信号处理程序中使用条件变量

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(); 
    } 
} 

回答

6

A C++ 14草案标准N4296说:

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

强调我的。

+1

C++ 14标准草案,[N4296](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf)。 –

+3

为了总结这个相当无用的答案,不,你不能使用一个条件变量,因为它不是来自公共子集的一个特征。 – simonwo