I am trying to understand std::condition_variable in C++. I expect the wait statement in function called third to prevent progression until second and first have finished, but this isn't the case. Why isn't it waiting? It is consistently printing 1,3,2.
#include <functional>
#include <mutex>
#include <condition_variable>
#include <future>
#include <iostream>
#include <string>
condition_variable c;
bool is1C=false, is2C=false, is3C=false;
mutex m1,m2,m3;
void printFirst(){
cout<<"1";
}
void printSecond(){
cout<<"2";
}
void printThird(){
cout<<"3";
}
void first(function<void()> printFirst) {
printFirst();
is1C=true;
c.notify_all();
}
void second(function<void()> printSecond) {
unique_lock<mutex> sL1(m1);
c.wait(sL1,[]{return is1C==true;});
printSecond();
is2C=true;
c.notify_all();
}
void third(function<void()> printThird) {
unique_lock<mutex> sL2(m2);
c.wait(sL2,[]{return is2C==true && is2C==true;});
printThird();
}
int main() {
function<void()> printFirstN=printFirst;
function<void()> printSecondN=printSecond;
function<void()> printThirdN=printThird;
std::async(printFirstN);
std::async(printThirdN);
std::async(printSecondN);
}