关键部分所有权
Posted
技术标签:
【中文标题】关键部分所有权【英文标题】:Critical Section OwnerShip 【发布时间】:2010-07-29 06:21:07 【问题描述】:如果一个线程当前拥有一个临界区锁,而其他线程正试图拥有这个锁,那么除了拥有该锁的线程之外的所有线程都进入等待队列等待释放锁。
当最初拥有的线程释放临界区锁时,等待队列中的一个线程将被选中运行并赋予临界区锁以允许线程运行。
如何选择下一个要运行的线程,因为不能保证首先出现的线程将是该线程的所有者。
如果线程不是以 FIFO 方式提供服务,那么如何从等待队列中选择下一个所有者线程?
【问题讨论】:
一般来说,这取决于内核,或者任何实现锁的库。 你问的是哪个操作系统? 【参考方案1】:获取关键部分的下一个线程是不确定地选择的。您唯一应该关心的是关键部分是否被公平地实现,即没有线程等待无限长的时间才能轮到它。如果需要按特定顺序运行线程,则必须自己实现。
【讨论】:
你不确定的是什么。没有实现任何算法。如果您可以不确定地解释,请提供。 Non-deterministic 在此上下文中出于所有实际目的是“随机的”。 其实:你问这个干嘛?如果您只是对内部运作感到好奇,请阅读一本有关操作系统设计的书。如果您正在设计应用程序,则不得依赖 CS 用来唤醒线程的任何特定算法。 实际上我正在实现一个等待线程向量,并希望从该向量中删除锁定所有权获取线程。 你当时应该问这个问题,真的。简单的解决方案:让获得关键部分的线程自行删除。【参考方案2】:下一个线程是按照准先进先出的顺序选择的。然而,许多系统级变量可能会导致这看起来不确定:
来自Concurrent Programming On Windows by Joe Duffy:(第5章)
...当线程数固定时 需要唤醒,操作系统使用 半公平算法可供选择 他们:当线程等待它们被放置 在一个 FIFO 队列中,唤醒 逻辑在确定哪个 线程唤醒。有的线程 等待时间最长的是 因此比以前的线程更受欢迎 等待的时间更少。虽然操作系统 确实使用了严格的 FIFO 数据结构 管理等候名单; ... 这 订购经常受到干扰 其他系统代码,不可靠。
【讨论】:
【参考方案3】:Posix 线程执行 FIFO 队列。
【讨论】:
【参考方案4】:线程调度算法呢,处于等待状态的线程按照线程调度算法获得优先级 如果我错了请指正。
【讨论】:
以上是关于关键部分所有权的主要内容,如果未能解决你的问题,请参考以下文章