1

C++ には 2 つのスレッドがあります。アラーム スレッドと呼ばれる 1 つのスレッドが関数raiseAlarm()を実行し、印刷スレッドと呼ばれる別のスレッドが と呼ばれる関数を実行しますprintMetrics。一定間隔でraiseAlarm、アトミック変数を に設定しますtrue。変数がの場合、このアトミック変数の値でスピンしているスレッドは、いくつかのデータを出力しますtrueprintMetricsこのアプリケーションを実行しても何も起こりません。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();
    }

}
4

1 に答える 1

6

私は C++ での同時実行に精通していないため、単なる提案ですが、出力ストリームをフラッシュすることを忘れないようにしてください。cout << flush;すべてのcout行の後にa を貼り付けるか、各行に a を追加します<< endl(これにより、ストリームが自動的にフラッシュされます)。

于 2013-02-01T23:03:11.803 に答える