C++11 Can I ensure a condition_variable.wait() won't miss a notification?

Viewed 2203

I have thread 1 executing the following code:

unique_lock<mutex> ul(m);
while(condition == true)
    cv.wait(ul);

And thread 2 executing this code:

condition = false;
cv.notify_one();

Unfortunately I'm hitting a timing issue:

T1: condition checks true
                            T2: condition set to false
                            T2: cv.notify_one()
T1: cv.wait()

Thread 1 misses the notification completely and remains blocked on wait(). I tried using the version of wait() which takes a predicate but with essentially the same result. That is, the body of the predicate performs the check, but before it returns, the condition's value is changed and the notification is sent. The predicate then returns.

How can I fix this?

2 Answers
Related