0

上のコードが実行されずに関数 doWork() が呼び出されるのはなぜだろうか。コードは次のとおりです。

void doWork()
{
std::cout<<"Hello World>";
sleep(1);
doWork();
}

....

void foo()
{
std:cout<<"This is text is never seen in the console but doWork timer callback works";
std::thread thread([&]{doWork();});
}

std:cout が機能しないのに std::thread が実行されているのはなぜですか?

ありがとう

4

2 に答える 2

2
  1. バッファをフラッシュしません。<< std::flush最後にorを追加してみてください<< std::endl

  2. threadオブジェクトが破棄される前に、スレッドでの実行が終了するのを待つ必要があります。

    thread.join(); // Wait for thread to finish.
    
  3. すべてをラムダ ( ) 内の参照としてキャプチャする必要はありません[&]。これらのキャプチャを使用していないようです。

  4. 移植可能な C++11 ライブラリを使用している場合は、Linux 固有の関数std::threadを使用しないでください。sleep代わりに を使用しますstd::this_thread::sleep_for。例:

    void doWork() {             // (1. Flush buffer here too)
        std::cout << "Hello World>" << std::flush;
                                // 4. Use portable sleep.
        std::this_thread::sleep_for(std::chrono::seconds(1));
        doWork();
    }
    
    // ....
    
    void foo() {
                                // 1. Flush buffer.
        std::cout << "This text is seen in the console" << std::endl;
        std::thread thread([] { // 3. No need to capture everything by reference
            doWork();
        });
        thread.join();          // 2. Wait for thread to finish.
    }
    
于 2013-11-07T13:37:39.807 に答える
0

cout はバッファリングされます。バッファがフラッシュされていない場合、すぐには出力されません。

以下を使用できます。

std::cout << "Text" << std::endl;

または:

std::cout << "Text\n" << std::flush;

バッファをフラッシュします。

于 2013-11-07T13:37:20.527 に答える