我在C ++中有两个线程。一个名为alarm thread的线程运行函数raiseAlarm()
,另一个名为print thread的线程运行名为printMetrics
的函数。在固定的时间间隔内,raiseAlarm
将原子变量设置为true
。当变量为true
时,printMetrics
线程(在此原子变量的值上旋转)会打印一些数据。当我运行此应用程序时,没有任何反应。但是,如果我在cout
中放置raiseAlarm
,一切正常。为什么呢?
void Client::raiseAlarm()
{
bool no = false;
while(!stop.load(std::memory_order_acquire))
{
//cout << "about to sleep\n";
this_thread::sleep_for(std::chrono::seconds(captureInterval));
while(!alarm.compare_exchange_weak(no, true, std::memory_order_acq_rel))
{
no = false;
}
}
}
void Client::printMetrics()
{
bool yes = true;
while(!stop.load(std::memory_order_acquire))
{
while(!alarm.compare_exchange_weak(yes, false, std::memory_order_acq_rel) )
{
yes = true;
}
cout << "Msgs Rcvd: " << metrics.rcv_total.load(std::memory_order_acquire);
cout << "Msgs Sent: " << metrics.snd_total.load(std::memory_order_acquire);
cout << "Min latency: " << metrics.min_latency.load(std::memory_order_acquire);
cout << "Max latency: " << metrics.max_latency.load(std::memory_order_acquire);
metrics.reset();
}
}
答案 0 :(得分:6)
只是一个建议,因为我对C ++中的并发性并不那么精明,但请确保不要忘记刷新输出流。在所有cout << flush;
行之后粘贴cout
或为每个行添加<< endl
(这将自动刷新您的流)。