如果一个临界区锁当前由一个线程拥有,而其他线程正在尝试拥有这个锁,那么除了拥有该锁的线程之外的所有线程都会进入等待队列,等待该锁被释放。
当初始拥有线程释放临界区锁时,等待队列中的一个线程将被选择运行,并被赋予允许线程运行的临界区锁。
如何选择要运行的下一个线程,因为不能保证第一个来的线程将是该线程的所有者。
如果线程不是以FIFO方式提供服务的,那么如何从等待队列中选择下一个拥有者线程?
发布于 2010-07-29 14:25:18
获取临界区的下一个线程是非确定性选择的。你唯一应该关心的是临界区的实现是否公平,也就是说,没有线程会等待无限长的时间才能轮到它。如果你需要以特定的顺序运行线程,你必须自己实现它。
发布于 2010-07-29 14:39:44
下一个线程是以准FIFO顺序选择的。但是,许多系统级变量可能会导致这看起来不确定:
来自Concurrent Programming On Windows by Joe Duffy:(第5章)
...当需要唤醒固定数量的线程时,操作系统使用半公平算法在它们之间进行选择:在线程等待时,它们被置于FIFO队列中,唤醒逻辑在确定要唤醒哪个线程时会参考该队列。因此,等待时间最长的线程优先于等待时间较短的线程。尽管操作系统确实使用了严格的FIFO数据结构来管理等待列表;这种排序经常会受到其他系统代码的干扰,因此是不可靠的。
发布于 2010-07-29 14:47:43
Posix线程执行FIFO队列。
https://stackoverflow.com/questions/3359920
复制相似问题