如何每 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 秒执行一次特定代码