奇怪的行为,cout使程序工作的地方 C++中有两个线程。一个名为alarm thread的线程运行函数raiseAlarm(),另一个名为print thread的线程运行函数printMetrics。以固定的间隔,raiseAlarm将原子变量设置为

奇怪的行为,cout使程序工作的地方 C++中有两个线程。一个名为alarm thread的线程运行函数raiseAlarm(),另一个名为print thread的线程运行函数printMetrics。以固定的间隔,raiseAlarm将原子变量设置为,c++,C++,奇怪的行为,cout使程序工作的地方 C++中有两个线程。一个名为alarm thread的线程运行函数raiseAlarm(),另一个名为print thread的线程运行函数printMetrics。以固定的间隔,raiseAlarm将原子变量设置为true。当变量为true时,printMetrics线程会打印一些数据,该线程会根据该原子变量的值旋转。当我运行这个应用程序时,什么都没有发生。但是如果我把cout放在raiseAlarm的任何地方,一切都会正常。为什么? void Clie

奇怪的行为,cout使程序工作的地方

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

}
void客户端::raiseAlarm()
{
布尔否=假;
而(!stop.load(std::memory\u order\u acquire))
{

/c/tUp> p>只是一个建议,因为我对C++的并发性不太了解,但是请确保不要忘记刷新输出流。要么粘贴<代码> cOUT> P>,只是因为C++中的并发性不太好,但请确保不要忘记刷新输出流。同意。或者至少在某个地方换行。效果很好!!谢谢。@Jimm-似乎您的控制台输出中没有任何换行符?如果您使用std::endl,则会导致隐式刷新,而发送“\n”时会发送换行符,但不会刷新输出。在您的情况下,我只会在第4行的末尾刷新,在所有剩余的h之后挑剔:
flush
是流修饰符还是类的方法?我总是使用
cout.flush();
。这也是我的直觉。同意。或者至少是某个地方的换行符。效果很好!!谢谢。@Jimm-似乎你的控制台输出中没有任何换行符?如果你使用std::endl,这会导致隐式刷新,而发送“\n”会发送换行符,但不会刷新输出。在你的情况下,我只会在结束时刷新第四行,在所有剩余的都被缓冲之后。挑剔:是
flush
流修饰符还是类的方法?我总是使用
cout.flush();
。您不应该忙于使用原子变量进行轮询,而更好的解决方案是使用信令。在我的情况下,经典睡眠模型会引入大量延迟。您不应该忙于使用原子变量进行轮询,而更好的解决方案是使用信令。在我的情况下,经典睡眠模型会引入大量延迟。