c ++:为什么回调定义之前没有执行回调而是函数?

时间:2013-11-07 13:29:49

标签: c++ multithreading c++11 callback boost-thread

我想知道为什么在没有执行高级代码的情况下调用函数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正在执行?

由于

2 个答案:

答案 0 :(得分:2)

  1. 您不刷新缓冲区。请尝试在最后添加<< std::flush<< std::endl

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

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

  4. 如果您使用的是可移植的C ++ 11 std::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.
    }
    

答案 1 :(得分:0)

cout是缓冲的,如果缓冲区未刷新,则不会立即打印。

您可以使用:

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

或者:

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

冲洗缓冲区。