返回信息流我用WaitForMultipleObjects做多线程同步:
一共16个线程,每个线程结束之后都释放一个信号量,然后主线程用WaitForMultipleObjects(16, sems, TRUE, -1)来收集。
然后就出了两个很奇怪的问题:
#1.
16个线程都正常结束了,信号量也都释放了,但是这个WaitForMultipleObjects还要再等40ms左右才能结束。。。
我在每个线程释放信号量之后都把时间打出来,以毫秒为单位,都在833~834之间,但是在主线程WaitForMultipleObjects之后打印时间则是875,不太明白为什么。。。。
理论上应该是834或835啊。。。
#2.
类似的,主线程在一开始要用ReleaseSemaphore释放16个信号,但是每个线程要再等40ms左右才能开始。。。。
主线程在447ms把16个信号量释放完毕,但是16个线程开始的时间是在485~486。。。。理论上应该都是447或448。
主线程打印的位置在Release 16个信号量之后,子线程打印的位置在WaitForSingleObject之后。
这两个问题不会同时发生,每次最多发生一个。
后来我直接手动用数组来进行同步,这两个问题就都解决了。。。
不过这个原理我很想弄清楚,所以请教各位大神,是不是WaitForMultipleObjects这个机制本身就不能保证实时性?还是有别的原因?
这是一条镜像帖。来源:北邮人论坛 / cpp / #96973同步于 2017/12/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
Windows多线程同步的实时性问题
yicigenshi
2017/12/7镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
你问“实时性”,那么得先看这个概念的定义是什么。在 Wiki 上最贴近的定义是 [Real-time computing](https://en.wikipedia.org/wiki/Real-time_computing)。
读读这个条目,它表明“实时性”是指受到“real-time constraint”约束的软件或硬件系统。
那么回到最初的问题,你用的是 Windows,它是否受“real-time constraint”的约束呢?不。所以这个答案是 WaitForMultipleObjects 不保证实时性。
再进一步探索原因,那只能说是实现相关。操作系统实现(比如线程调度)、你的代码实现、CPU核数等因素都可能会带来影响。根据你描述“用数组同步”后就没有延迟,那么比较可能的原因是信号量是内核对象,通知会有一定的延迟。不过还是需要进一步测试才能证明。
最后插一句题外话,如果要等16个线程结束,直接 wait 线程的句柄就可以了,没必要用信号量。