首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >临界区OwnerShip

临界区OwnerShip
EN

Stack Overflow用户
提问于 2010-07-29 14:21:07
回答 4查看 439关注 0票数 2

如果一个临界区锁当前由一个线程拥有,而其他线程正在尝试拥有这个锁,那么除了拥有该锁的线程之外的所有线程都会进入等待队列,等待该锁被释放。

当初始拥有线程释放临界区锁时,等待队列中的一个线程将被选择运行,并被赋予允许线程运行的临界区锁。

如何选择要运行的下一个线程,因为不能保证第一个来的线程将是该线程的所有者。

如果线程不是以FIFO方式提供服务的,那么如何从等待队列中选择下一个拥有者线程?

EN

回答 4

Stack Overflow用户

发布于 2010-07-29 14:25:18

获取临界区的下一个线程是非确定性选择的。你唯一应该关心的是临界区的实现是否公平,也就是说,没有线程会等待无限长的时间才能轮到它。如果你需要以特定的顺序运行线程,你必须自己实现它。

票数 3
EN

Stack Overflow用户

发布于 2010-07-29 14:39:44

下一个线程是以准FIFO顺序选择的。但是,许多系统级变量可能会导致这看起来不确定:

来自Concurrent Programming On Windows by Joe Duffy:(第5章)

...当需要唤醒固定数量的线程时,操作系统使用半公平算法在它们之间进行选择:在线程等待时,它们被置于FIFO队列中,唤醒逻辑在确定要唤醒哪个线程时会参考该队列。因此,等待时间最长的线程优先于等待时间较短的线程。尽管操作系统确实使用了严格的FIFO数据结构来管理等待列表;这种排序经常会受到其他系统代码的干扰,因此是不可靠的。

票数 2
EN

Stack Overflow用户

发布于 2010-07-29 14:47:43

Posix线程执行FIFO队列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3359920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档