如果一个线程当前拥有一个关键部分锁,并且其他线程试图拥有这个锁,那么除了拥有该锁的线程之外的所有线程都会进入等待队列以释放该锁。 / p>
当初始拥有线程释放临界区锁时,将选择等待队列中的一个线程运行并给予临界区锁以允许线程运行。
如何选择下一个运行的线程,因为不能保证首先出现的线程将成为该线程的所有者。
如果没有以FIFO方式提供线程,那么如何从等待队列中选择下一个所有者线程?
答案 0 :(得分:3)
获取临界区的下一个线程是非确定性选择的。你应该关注的唯一事情是关键部分是否公平地实现,即没有线程等待无限长时间来轮到它。如果需要按特定顺序运行线程,则必须自己实现。
答案 1 :(得分:2)
以准FIFO顺序选择下一个线程。但是,许多系统级变量可能会导致这看起来不确定:
来自Concurrent Programming On Windows by Joe Duffy :(第5章)
...当有固定数量的线程时 需要被唤醒,操作系统使用一个 半公平算法之间进行选择 他们:当线程等待他们被放置 在唤醒的FIFO队列中 逻辑在确定哪个时进行咨询 线程醒来。有线程的 等待时间最长的都是 因此优于线程 等待更少的时间。虽然操作系统 确实使用严格的FIFO数据结构 管理等候名单; ... 这个 订购经常被扰乱 其他系统代码并不可靠。
答案 2 :(得分:0)
Posix线程执行FIFO队列。
答案 3 :(得分:0)
线程调度算法怎么样,等待状态的线程按照线程调度算法获得优先级 如果我错了,请纠正。