3

我有多个线程在紧密循环中更新单个数组。(双核处理器上的 10 个线程 @ 每秒大约 100000 次更新)。每次在互斥锁(WaitForSingleObject / ReleaseMutex)的保护下更新数组。我注意到没有线程对数组进行两次连续更新,这意味着必须有某种与同步相关的产量。这意味着每秒发生大约 100000 次上下文切换,这似乎是次优的。为什么会这样?

4

2 回答 2

2

这里的问题是所有等待线程的顺序。

在 WaitForSingleObject 中阻塞的每个线程都会进入一个队列,然后被调度程序挂起,这样它就不会再占用执行时间了。释放互斥锁后,调度程序会恢复其中一个等待线程。未指定从队列中唤醒线程的确切顺序,但在许多情况下,这将是简单的先进先出。

现在发生的情况是,如果同一个线程释放互斥体,然后在同一个互斥体上执行另一个 WaitForSingleObject,他将被重新插入队列中,并且他不太可能被插入到队列的前面,如果已经有其他线程在等待。这是有道理的,因为允许他跳到队列的前面可能会导致其他线程饿死。所以调度程序可能只是暂停他并唤醒位于队列前面的线程。

于 2013-06-14T10:27:51.530 回答
0

我想这是因为多处理器。

当第一个线程(在第一个处理器上运行)释放互斥锁时,第二个线程(在第二个处理器上)得到它,然后当第一个线程尝试获取互斥锁时,它不能。当第二个线程最终释放互斥锁时,它被第三个线程(在第一个处理器上)占用。

于 2013-06-14T10:29:25.547 回答