В t1
функция не проверяет постоянно alive
. Вы разработали его так, чтобы каждый цикл начинался с ожидания переменной условия. Затем он идет спать и просыпаться только при получении уведомления. К сожалению, когда main устанавливает значение false в false, поток t1 все еще находится в состоянии ожидания.
Вы можете наблюдать это легко:
void showNum(int &f_, atomic_bool &alive_)
{
while(alive_)
{ cout<<"waiting..."<<endl;
unique_lock<mutex> lk(m);
cout<<"waiting more..."<<endl;
cov.wait(lk,[]{ return ready;}); ///<<<<< stuck here
cout<<"go..."<<endl;
f_++;
ready = false;
processed= true;
lk.unlock();
cout<<" sn:"<<f_<<endl;
cov.notify_one();
}
}
Он проснется только в том случае, если main
обеспечит еще одно уведомление о условной переменной. Только в этот момент он выйдет из состояния ожидания и после обработки обнаружит, что alive
равно false
.
Чтобы не застрять навсегда, вы можете изменить свой код и использовать wait_for()
, чтобы функция могла проверить время ожидания, если оно все еще остается alive
.