2015-07-20 11 views
7

Ist es sicher zu verwenden std::condition_variable::notify_one im Signal-Handler? Beispiel:C++ 11 Verwendung Zustandsvariable im Signal-Handler

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

Antwort

6

A C++ 14 Norm-Entwurf N4296 sagt:

[support.runtime]/10 Die gemeinsame Teilmenge der C und C++ Sprachen aller Erklärungen, Definitionen besteht, und Ausdrücke , die in einem wohlgeformten C++ - Programm und auch in einem konformen C-Programm erscheinen können. Eine POF ("plain old function") ist eine Funktion, die nur Merkmale aus dieser gemeinsamen Teilmenge verwendet und die nicht direkt oder indirekt irgendeine Funktion verwendet, die keine POF ist, außer dass sie einfache blockfreie atomare Operationen verwenden kann. .. Das Verhalten einer beliebigen -Funktion außer einer POF, die als Signalhandler in einem C++ - Programm verwendet wird, ist implementierungsdefiniert.

Schwerpunkt meiner.

+1

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

+3

Um diese eher wenig hilfreiche Antwort zusammenzufassen, können Sie keine Bedingungsvariable verwenden, weil sie kein Merkmal der gemeinsamen Teilmenge ist. – simonwo