2015-07-20 84 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