在信号处理程序中使用
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(); } }
解决方法
C 14标准草案
N4296说:
[support.runtime]/10 The common subset of the C and C++ languages consists of all declarations,definitions,and expressions
that may appear in a well formed C++ program and also in a conforming C program. A POF (“plain old
function”) is a function that uses only features from this common subset,and that does not directly or indirectly use any function that is not a POF,except that it may use plain lock-free atomic operations… The behavior of any
function other than a POF used as a signal handler in a C++ program is implementation-defined.
强调我的.