C++主线程每3分钟创建独立子线程的技术问题及代码求助
问题分析与修复方案
首先得指出你当前代码里的致命问题:你在main_thread_func的无限循环里反复调用thread_timer,这意味着每一次循环都会创建一个新的后台线程,而每个线程自己又在无限循环里每隔3分钟执行foo。用不了多久,你的程序就会被成百上千个线程占满资源,完全偏离了你“每3分钟创建一个子线程”的需求。
问题根源拆解
- 你的
thread_timer函数本身会创建一个无限循环的线程,而主线程的while(1)又不断调用它,导致线程数量爆炸。 - 你真正需要的是一个调度线程,它每隔3分钟主动创建一个执行任务的子线程,而不是主线程循环去启动调度线程。
修复后的实现方案
下面是调整后的代码,完全符合你的需求:主线程正常运行,一个调度线程负责每3分钟创建一个子线程执行任务,子线程完成后自动退出。
#include <iostream> #include <thread> #include <chrono> #include <functional> // 启动一个定时调度线程,每隔interval毫秒创建一个子线程执行任务 void start_periodic_task(std::function<void(void)> task, unsigned int interval_ms) { // 调度线程本身作为后台线程运行 std::thread([task, interval_ms]() { while (true) { // 先等待指定间隔,再创建任务线程(如果需要启动即执行,就把task()移到sleep前面) auto next_execution = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval_ms); std::this_thread::sleep_until(next_execution); // 创建独立子线程执行任务,完成后自动退出 std::thread(task).detach(); } }).detach(); } void foo() { std::cout << "Doing something in a child thread...\n"; } void main_thread_func() { // 只需要调用一次,启动调度线程即可 start_periodic_task(foo, 180000); // 3分钟 = 180000毫秒 // 主线程正常执行自己的任务,不受子线程影响 while (true) { std::cout << "Main thread is running its own tasks...\n"; std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟主线程的工作 } } int main() { main_thread_func(); return 0; }
关键细节说明
- 单调度线程:主线程只调用一次
start_periodic_task,它会启动一个专门的调度线程,这个线程是唯一负责定时的线程,避免了线程泛滥。 - 任务线程独立运行:每次间隔到了,调度线程就创建一个新的子线程执行
foo,任务完成后子线程自动销毁,不会占用资源。 - 灵活调整执行时机:如果希望程序启动时立刻执行一次
foo,只需要把task();移到sleep_until前面即可。 - 线程安全考量:如果
foo涉及共享资源,记得加锁保护,避免数据竞争。
内容的提问来源于stack exchange,提问作者user1228352
相关产品推荐
相关产品推荐

