如何每 X 秒创建一次线程,但前提是之前的迭代线程在 C++11 中完成?

Posted

技术标签:

【中文标题】如何每 X 秒创建一次线程,但前提是之前的迭代线程在 C++11 中完成?【英文标题】:How to create thread every X seconds but only if previous iteration thread is finished in C++11? 【发布时间】:2020-01-20 07:17:33 【问题描述】:

我有以下要求: “每 X 秒创建一个分离的工作线程,但前提是之前创建的分离线程完成。如果在超时结束时,前一个线程没有完成,则终止它并创建新线程。”

请注意,我需要创建分离线程,因为我不希望我的主线程等待它完成。

我正在使用 C++11 线程类。

有什么帮助吗?

提前致谢。

【问题讨论】:

在上一个线程的末尾创建新线程? @SedatKapanoglu 是的。我有一个固定的线程创建超时(300 秒)。在超时结束时,我想检查最后创建的线程(分离)是否还活着。如果不存在,则仅创建新线程。目标是一次只有一个工作线程。 真的需要创建多个线程吗?为什么不重用单线程来无限循环运行worker函数呢? 是的,我必须为每个超时创建一个新线程。因为线程创建还取决于其他参数。如果没有数据可取,则无需继续线程运行。 您是 GUI 还是控制台/服务应用程序?如果您是 GUI,这很容易。控制台或服务应用程序 - 略有不同。 【参考方案1】:

以 Sedat Kapanoglu 的评论为基础,您可以在当前线程结束时启动新线程,但如果“每 X 秒”尚未过去,则添加超时。

您可以使用包装函数来做到这一点。

也许类似这样:

void worker_wrapper()

    using namespace std::chrono_literals;

    auto start = std::chrono::system_clock::now();

    // Run actual worker function
    worker();

    auto end = std::chrono::system_clock::now();

    // If less than 300 seconds have passed, wait for the remainder of the 300 seconds
    if (end - start < 300s)
    
        std::this_thread::sleep_for(300s - (end - start));
    

    // Create a new thread
    std::thread next_thread(worker_wrapper);
    next_thread.detach();

您当然可以添加条件来检查是否应该启动新线程。

【讨论】:

以上是关于如何每 X 秒创建一次线程,但前提是之前的迭代线程在 C++11 中完成?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中并行化一个 for 循环,只创建一次线程池

在 ASP.NET Web API 中创建一个线程每 X 秒执行一次特定代码

如何使用多线程、单次迭代加载测试

C++无锁线程问题 - 多个线程在一个连续数组上迭代,但从未访问过相同的成员数据?

在 for 循环中有效地打印每 x 次迭代

c# 每 x 秒运行一次数据库任务