探讨:线程循环与激活(C++11)
初级代码游戏的专栏介绍与文章目录-CSDN博客
github位置:codetoys/ctfc.git src/function/WorkThread.h
关于并发程序的交互,办法挺多,但是既要快速响应又要节省CPU的没什么太好的现成策略。我这里提个思路,大家探讨探讨。
目录
分析
设计
代码
三个成员:
工作线程:
激活工作线程:
定时器线程:
分析
死循环,响应速度够快,但是浪费CPU,每个循环加上一个sleep(0)或者yield(),能省一些cpu,但是还是会很烫。
用事件触发(最省CPU),有可靠的消息机制的当然好,只是发一个信号的那种,存在错过信号的问题。因为一般只有在线程调用等待函数之后发出的信号才能被收到,工作线程正在工作时不能接收信号。由于并发特性,检测线程工作状态和发送信号之间可能是无限长的,实际发送的时候工作线程已经不是刚才检测到的状态了。
设计
我现在考虑使用这么个机制:
- 信号和标志位双触发机制
- 控制线程同时发送信号和设置标志位
- 工作线程循环处理,处理开始清除标志位,处理结束检查标志位,有标志位继续处理,没有则等待信号
- 唯一会错过的情形是控制线程的两步操作(设置和发送)刚好在工作线程的两步操作(检查和