Multithreading 当线程数大于逻辑CPU数时,为什么MCS锁的吞吐量很低

Multithreading 当线程数大于逻辑CPU数时,为什么MCS锁的吞吐量很低,multithreading,computer-architecture,microprocessors,Multithreading,Computer Architecture,Microprocessors,当线程数大于逻辑CPU数时,为什么mcs锁的吞吐量较差。 这可能是因为cpu上的位置竞争加剧,导致大量线程被抢占吗?我对此不是100%,但Microsoft库给出了Sleep()函数的以下定义: 睡眠间隔过后,线程就可以运行了。如果指定0>毫秒,线程将放弃剩余的时间片,但保持>就绪。请注意,就绪线程不能保证立即运行。因此,>线程可能在睡眠间隔结束后的一段时间内才会运行 根据我的经验,如果我使用一个MCS锁来更新一个数据结构,并且我运行它的线程数是16,那么从8到16个线程(假设线程数是原来的两倍

当线程数大于逻辑CPU数时,为什么mcs锁的吞吐量较差。
这可能是因为cpu上的位置竞争加剧,导致大量线程被抢占吗?

我对此不是100%,但Microsoft库给出了
Sleep()
函数的以下定义:

睡眠间隔过后,线程就可以运行了。如果指定0>毫秒,线程将放弃剩余的时间片,但保持>就绪。请注意,就绪线程不能保证立即运行。因此,>线程可能在睡眠间隔结束后的一段时间内才会运行

根据我的经验,如果我使用一个MCS锁来更新一个数据结构,并且我运行它的线程数是16,那么从8到16个线程(假设线程数是原来的两倍)的下降(不包括1-2个线程的大量下降)是相当大的。吞吐量在一个线程之后下降到大约三分之一,然后随着正在使用的线程数接近CPU数而缓慢下降到。显然,如果您使用的是锁,那么尝试获取锁的线程越多,CPU的缓存一致性工作就越多

如果您使用任何原子指令(再次假设您是),那么添加的线程越多,速度就会越慢

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

这是从stackoverflow的另一位成员那里获取的,是关于类似问题的。再加上线程可能睡眠,也可能不睡眠,即使使用
sleep()
,也可能会立即醒来,这可能会导致吞吐量的严重损失。你还需要应付日益增加的公共汽车流量