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或。<< std::endl

  2. thread在对象被破坏之前,您需要等待线程中的执行完成。

    thread.join(); // Wait for thread to finish.
    
  3. 您不需要将所有内容都捕获为 lambda ( [&]) 中的引用。您似乎没有使用任何这些捕获。

  4. 如果您使用的是可移植的 C++11std::thread库,请不要使用特定于 Linux 的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 回答