优化迭代原子操作检查次数V2:双线程应用状态切换技术问询
嘿,我来帮你把这个主线程与工作线程的对象启停设计梳理清楚,结合代码示例和关键细节说明,让逻辑更清晰:
主线程与工作线程的对象启停实现方案
核心运行流程
- 主线程会持续循环调用
MainUpdate()函数,这个函数是整个应用的控制入口之一 - 在
MainUpdate()的循环过程中,会根据业务逻辑对指定的工作对象调用ToggleActive()方法,用来启停这些对象 - 需要注意的是,被调用
ToggleActive()的对象很可能正处于工作线程的运行状态中,所以必须处理好线程同步问题,避免竞态条件
代码实现示例
// 主线程核心逻辑 class MainThread { private: ThreadPool threadPool; // 管理工作线程的线程池 std::vector<std::shared_ptr<WorkObject>> workObjects; // 所有工作对象集合 public: void MainUpdate() { // 持续循环执行,直到应用终止 while (isApplicationRunning()) { // 模拟触发对象启停的条件:比如用户交互、定时任务、状态变更等 if (needToggleWorkObject()) { WorkObject* targetObj = getTargetWorkObject(); if (targetObj != nullptr) { targetObj->ToggleActive(); } } // 主线程的其他业务逻辑处理 std::this_thread::sleep_for(std::chrono::milliseconds(15)); // 避免占用过多CPU } } }; // 工作对象类,包含自身的工作线程逻辑 class WorkObject { private: std::atomic<bool> isActive{false}; // 原子变量保证状态读写的线程安全 std::thread workerThread; std::mutex stateMutex; std::condition_variable stateCV; bool shouldTerminate{false}; // 工作线程的循环逻辑 void WorkerLoop() { while (true) { std::unique_lock<std::mutex> lock(stateMutex); // 等待激活信号或者终止指令 stateCV.wait(lock, [this](){ return isActive || shouldTerminate; }); // 如果收到终止指令,退出循环 if (shouldTerminate) { break; } // 处于激活状态时执行工作任务 if (isActive) { ExecuteWorkTask(); } } } // 实际的工作任务逻辑 void ExecuteWorkTask() { // 这里写具体的业务代码:比如数据计算、IO操作、消息处理等 } public: WorkObject() { // 初始化时启动工作线程 workerThread = std::thread(&WorkObject::WorkerLoop, this); } ~WorkObject() { // 析构时确保工作线程安全退出 shouldTerminate = true; stateCV.notify_one(); if (workerThread.joinable()) { workerThread.join(); } } // 启停对象的核心方法 void ToggleActive() { // 原子翻转激活状态 isActive = !isActive.load(); // 唤醒工作线程,让它立即响应状态变化 stateCV.notify_one(); } };
关键细节说明
- 线程安全的状态管理:用
std::atomic<bool>来存储isActive状态,确保主线程和工作线程对这个状态的读写操作是原子性的,不会出现竞态条件 - 高效的线程休眠与唤醒:通过条件变量
std::condition_variable让工作线程在非激活状态下进入休眠,避免空循环浪费CPU资源,当状态变化时再快速唤醒 - 安全的资源清理:在工作对象的析构函数中,先设置终止标记,再唤醒线程,最后等待线程完成,保证线程资源被正确释放,不会出现内存泄漏或者线程残留
- 即时的状态响应:调用
ToggleActive()时,不仅翻转状态,还会立即通知工作线程,确保状态变化能被工作线程及时感知,不会出现延迟
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

