首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解锁互斥锁的调用是否一定要切换到锁上被阻塞的另一个线程?

解锁互斥锁的调用是否一定要切换到锁上被阻塞的另一个线程?
EN

Stack Overflow用户
提问于 2020-04-04 17:41:47
回答 1查看 435关注 0票数 2

假设我们有两个线程: th1和th2。

让我们想象一下这一系列事件:

  1. Th1锁住互斥锁,并在它的关键区域做一些工作。
  2. Th2调用互斥锁,但被阻止。
  3. Th1完成了关键区域的工作,并解锁互斥锁。

我现在的问题是:即使th1还有一些时间可以工作,解锁互斥锁的调用是否会导致立即上下文切换到锁上被阻塞的线程(在本例中是th2)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-06 02:21:04

不是,或者是在大多数情况下定义的实现。

通常,没有争议的互斥操作根本不需要进入内核,它们只是内存位置上的原子操作。当检测到冲突时(例如一个线程希望锁定另一个线程拥有的互斥对象),希望线程必须进入内核等待它;内核需要调整互斥量,以便拥有线程在内核完成时向内核发出信号。

区别在于,enter可以无限期地阻塞,直到释放互斥体;而信号仅仅表示这样的事件已经发生。

当内核被告知有争议的互斥对象已经可用时,它至少必须使等待的线程能够运行。当它运行时,它可能会发现互斥仍然不可用,并重新进入它的等待模式。

等待线程是否在释放线程之前运行可能基于确定性的事情,如优先级或调度类。面对多处理器,这两个线程可能同时释放在单独的CPU上,因此下一次获取互斥对象可能完全是不确定的。

另一方面,一些系统,如谷歌的公平调度互斥(完全在用户模式下完成),确保上述段落所暗示的饥饿不会发生。

因此,实现定义了;您的实现提供的定义在很大程度上说明了您的实现。

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

https://stackoverflow.com/questions/61032195

复制
相关文章

相似问题

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