stima
stima

Reputation: 131

c++11 use condition variable in signal handler

Is it safe to use std::condition_variable::notify_one in signal handler? Example:

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

Upvotes: 11

Views: 2165

Answers (1)

Igor Tandetnik
Igor Tandetnik

Reputation: 52471

A C++14 draft standard N4296 says:

[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.

Emphasis mine.

Upvotes: 3

Related Questions