c ++:为啥执行回调但回调定义之前的函数没有?

Posted

技术标签:

【中文标题】c ++:为啥执行回调但回调定义之前的函数没有?【英文标题】:c++: Why is callback executed but function before callback definition not?c ++:为什么执行回调但回调定义之前的函数没有? 【发布时间】:2013-11-07 13:29:49 【问题描述】:

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

谢谢

【问题讨论】:

也有错误。 std:cout 应该是 std::cout 【参考方案1】:

    您不刷新缓冲区。尝试在末尾添加&lt;&lt; std::flush&lt;&lt; std::endl

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

    thread.join(); // Wait for thread to finish.
    

    您不需要将所有内容都捕获为 lambda ([&amp;]) 中的引用。您似乎没有使用任何这些捕获。

    如果您使用的是可移植的 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.
    
    

【讨论】:

【参考方案2】:

cout 被缓冲,如果缓冲区没有被刷新,它不会立即打印。

你可以使用:

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

或者:

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

刷新缓冲区。

【讨论】:

以上是关于c ++:为啥执行回调但回调定义之前的函数没有?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AWS Lambda 函数在回调函数执行之前完成?

Node.js - 为啥我的一些回调没有异步执行?

为啥不包含头文件却可以调用函数,谁来解释

为啥python的函数没被调用就被执行了?

为啥自定义钩子的回调永远看不到组件道具

C++的变量为啥定义是要赋值?