2015-07-20 21 views
7

Czy można bezpiecznie używać std::condition_variable::notify_one w obsłudze sygnału? Przykład:C++ 11 zmienna warunków użycia w obsłudze sygnału

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

Odpowiedz

6

C++ 14 projekt normy N4296 mówi:

[support.runtime]/10 wspólnego podzbioru C i C++ języków obejmuje wszystkie zgłoszenia, definicji i wyrażenia , które mogą pojawić się w dobrze uformowanym programie C++, a także w zgodnym programie C. POF ("zwykła stara funkcja ") jest funkcją, która wykorzystuje tylko funkcje z tego wspólnego podzbioru i która nie wykorzystuje bezpośrednio ani pośrednio żadnej funkcji, która nie jest POF, z tym wyjątkiem, że może wykorzystywać proste operacje atomowe bez blokady. .. Zachowanie dowolnej funkcji innej niż POF używany jako program obsługi sygnału w programie C++ jest zdefiniowany przez implementację.

Podkreśl moje.

+1

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

+3

Podsumowując tę ​​raczej niepomocną odpowiedź, nie można użyć zmiennej warunku, ponieważ nie jest ona "funkcją ze wspólnego podzbioru". – simonwo