作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有多个线程在紧密循环中更新单个数组。 (双核处理器上有 10 个线程 @ 大约每秒 100000 次更新)。每次数组在互斥锁 (WaitForSingleObject/ReleaseMutex) 的保护下更新。我注意到没有线程对数组进行两次连续更新,这意味着必须有某种与同步相关的 yield 。这意味着每秒大约发生 100000 次上下文切换,这似乎不是最佳选择。为什么会这样?
最佳答案
这里的问题是所有等待线程都有一个顺序。
在 WaitForSingleObject 中阻塞的每个线程都进入一个队列,然后被调度程序挂起,这样它就不会再占用执行时间。释放互斥锁后,调度程序将恢复等待线程之一。未指定线程从队列中唤醒的确切顺序,但在许多情况下,它将是简单的先进先出。
现在发生的情况是,如果同一个线程释放互斥体,然后在同一个互斥体上执行另一个 WaitForSingleObject,他将被重新插入到队列中,而且他被插入到队列的前面的可能性很小如果已经有其他线程在等待,则队列。这是有道理的,因为允许他跳到队列的前面可能会导致其他线程挨饿。所以调度器可能只是挂起他并唤醒队列前面的线程。
关于multithreading - 为什么每次与互斥锁同步时都会发生线程上下文切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17105681/
我是一名优秀的程序员,十分优秀!