You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键细节说明

  1. 单调度线程:主线程只调用一次start_periodic_task,它会启动一个专门的调度线程,这个线程是唯一负责定时的线程,避免了线程泛滥。
  2. 任务线程独立运行:每次间隔到了,调度线程就创建一个新的子线程执行foo,任务完成后子线程自动销毁,不会占用资源。
  3. 灵活调整执行时机:如果希望程序启动时立刻执行一次foo,只需要把task();移到sleep_until前面即可。
  4. 线程安全考量:如果foo涉及共享资源,记得加锁保护,避免数据竞争。

内容的提问来源于stack exchange,提问作者user1228352

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:02:43