C++ 每 x 秒调用一个函数

标签 c++ multithreading

我试图每 5 秒运行一次 run() 函数,而不停止 while() 循环(并行)。我怎样才能做到这一点 ?提前致谢

    #include <iostream>
    #include <thread>
    #include <chrono>

    using namespace std;

    void run() 
    {
        this_thread::sleep_for(chrono::milliseconds(5000));

        cout << "good morning" << endl;
    }


    int main()
    {
        thread t1(run);
        t1.detach();

        while(1)
        {
            cout << "hello" << endl;

            this_thread::sleep_for(chrono::milliseconds(500));
        }

        return 0;
    }

最佳答案

在您的 main 中函数,了解每个线程在做什么很重要。

  1. 主线程创建一个std::threadt1
  2. 主线程继续并分离线程
  3. 主线程执行你的while循环其中:
    • 打印你好
    • 休眠 0.5 秒
  4. 主线程返回0,程序结束。

从第 1 点开始的任何时间,线程 t1 sleep 5 秒,然后打印早上好。这种情况只会发生一次!另外,正如@Fareanor指出的,std::cout不是线程安全的,所以用主线程和线程访问它 t1可能会导致数据竞争。

当主线程到达第 4 点时(实际上永远不会这样做,因为您的 while 循环是无限的),您的线程 t1可能已经完成了任务,也可能没有完成。想象一下可能发生的潜在问题。在 most of the cases ,您需要使用 std::thread::join() .

为了解决您的问题,有多种选择。下面,我们假设函数run的执行没有 std::this_thread::sleep_for根据 @Landstalker 的评论,与 5 秒相比微不足道。 run的执行时间然后将是 5 秒加上一些微不足道的时间。

按照评论中的建议,不要执行函数run每 5 秒,您可以简单地执行 run 的主体每 5 秒放置一个 while在该函数内部循环:

void run() 
{
    while (true)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(5000));
        std::cout << "good morning" << std::endl;
    }
}

int main()
{
    std::thread t(run);
    t.join();
    return 0;
}

如果由于某种原因,您确实需要执行run正如问题中所述,每 5 秒运行一次函数,您可以启动一个包装函数或 lambda,其中包含 while循环:

void run() 
{
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    std::cout << "good morning" << std::endl;
}

int main()
{
    auto exec_run = [](){ while (true) run(); };
    std::thread t(exec_run);
    t.join();
    return 0;
}

作为旁注,最好 avoid using namespace std .

关于C++ 每 x 秒调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60163449/

相关文章:

c++ - 在 CMake 项目中传递复制 dll

c++ - 模板 T 类数组

c++ - 将数据拟合到 3 次多项式

c++ - 第二个线程中的 wglMakeCurrent 失败了吗?

Java - 在哪里检测和捕获 SocketException

c++ - alglib BLEIC 优化器

c++ - Liskov 替换原则和游戏的类设计

java - 防止可能由于线程导致的堆内存不足异常

java - 如何用多个线程处理文件,使每个文件只由一个线程处理

c++ - WinAPI 将 "Edit"对话框写入管道(错误 : Stack around variable 'x' was corrupted)