假设我们有两个线程: th1和th2。
让我们想象一下这一系列事件:
我现在的问题是:即使th1还有一些时间可以工作,解锁互斥锁的调用是否会导致立即上下文切换到锁上被阻塞的线程(在本例中是th2)?
发布于 2020-04-06 02:21:04
不是,或者是在大多数情况下定义的实现。
通常,没有争议的互斥操作根本不需要进入内核,它们只是内存位置上的原子操作。当检测到冲突时(例如一个线程希望锁定另一个线程拥有的互斥对象),希望线程必须进入内核等待它;内核需要调整互斥量,以便拥有线程在内核完成时向内核发出信号。
区别在于,enter可以无限期地阻塞,直到释放互斥体;而信号仅仅表示这样的事件已经发生。
当内核被告知有争议的互斥对象已经可用时,它至少必须使等待的线程能够运行。当它运行时,它可能会发现互斥仍然不可用,并重新进入它的等待模式。
等待线程是否在释放线程之前运行可能基于确定性的事情,如优先级或调度类。面对多处理器,这两个线程可能同时释放在单独的CPU上,因此下一次获取互斥对象可能完全是不确定的。
另一方面,一些系统,如谷歌的公平调度互斥(完全在用户模式下完成),确保上述段落所暗示的饥饿不会发生。
因此,实现定义了;您的实现提供的定义在很大程度上说明了您的实现。
https://stackoverflow.com/questions/61032195
复制相似问题