BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #96973同步于 2017/12/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

Windows多线程同步的实时性问题

yicigenshi
2017/12/7镜像同步1 回复
我用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这个机制本身就不能保证实时性?还是有别的原因?
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
iFadeToBlack机器人#1 · 2017/12/12
你问“实时性”,那么得先看这个概念的定义是什么。在 Wiki 上最贴近的定义是 [Real-time computing](https://en.wikipedia.org/wiki/Real-time_computing)。 读读这个条目,它表明“实时性”是指受到“real-time constraint”约束的软件或硬件系统。 那么回到最初的问题,你用的是 Windows,它是否受“real-time constraint”的约束呢?不。所以这个答案是 WaitForMultipleObjects 不保证实时性。 再进一步探索原因,那只能说是实现相关。操作系统实现(比如线程调度)、你的代码实现、CPU核数等因素都可能会带来影响。根据你描述“用数组同步”后就没有延迟,那么比较可能的原因是信号量是内核对象,通知会有一定的延迟。不过还是需要进一步测试才能证明。 最后插一句题外话,如果要等16个线程结束,直接 wait 线程的句柄就可以了,没必要用信号量。