为什么当线程数大于逻辑CPU的数量时,MCS锁定的吞吐量差。 它可能是因为增加了CPU上的地方的争用,这导致了大量的线程被预先撤销?

有帮助吗?

解决方案

我不是100%,但Microsoft库给出了Sleep()函数的这个定义:

睡眠间隔已通过后,线程已准备好运行。如果指定0>毫秒,则线程将放弃其时间切片的其余部分,但仍然存在>准备好。请注意,没有保证就绪线程立即运行。因此,在睡眠间隔经过后的一段时间之前,可以不会运行>线程。

在我的经验中,如果我使用MCS锁定,让我们说,更新数据结构和我运行的线程数是16下降(不包括从1 - 2线程的大规模下降)到16个线程(假设您只需加倍线程)非常大。吞吐量在一个线程后大约第三个,然后慢慢减少,因为使用的线程数接近CPU的数量。显然,如果您使用锁定尝试获取锁的更多线程,您将为CPU进行更多的缓存缓存一致性工作。

如果您使用任何原子指令(再次假设您是),那将越慢,这将是较慢的。

“我不认为问题是原子操作将需要更长时间;真正的问题可能是原子操作可能会阻止在其他处理器上的总线操作(即使它们执行非原子操作)。”

这是关于类似问题的另一个StackOverflow成员。夫妇认为,即使使用Sleep()也可能无法睡眠,也可能或可能不会立即唤醒这可能导致吞吐量严重损失。您还有增加的总线流量来处理...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top