关于操作系统的开发,我听过"优先级倒置"这个短语.
什么是优先倒置?
它要解决的问题是什么,它是如何解决的?
我的应用程序运行良好,我在 Xcode 13.4 上没有收到此错误,是 Xcode 14 beta 错误还是我做了一些糟糕的线程处理?!
Thread running at QOS_CLASS_USER_INITIATED waiting on a lower QoS thread running at QOS_CLASS_DEFAULT. Investigate ways to avoid priority inversions
我不明白这个问题,所以我也添加了我的堆栈日志:
_TtGC7SwiftUI14_UIHostingViewVVS_P10$1dc8d4d8821BridgedNavigationView8RootView_ implements focusItemsInRect: - caching for linear focus movement is limited as long as this view is on screen.
2022-06-07 18:53:41.412342+0430 MyApp[916:25641] [UIFocus] _TtCC7SwiftUI17HostingScrollView22PlatformGroupContainer implements focusItemsInRect: - caching for linear focus movement is limited as long as this view is on screen.
Thread Performance Checker: Thread running at QOS_CLASS_USER_INITIATED waiting on a …Run Code Online (Sandbox Code Playgroud) 由于与它们相关的优先级,优先级倒置是在线程/进程的调度期间可能发生的问题.
优先级倒置是调度中的一个有问题的场景,其中高优先级任务被中等优先级任务间接抢占,有效地"反转"两个任务的相对优先级 - 维基百科
我想知道,Android中可以发生优先级倒置,因为我们知道Android提供了不同优先级的不同进程,请参阅这篇文章.我们还可以创建具有不同优先级的多个线程(在活动和服务中),它们如何适应这种情况?我看到一篇文章讨论Android中的线程调度.如果发生优先级倒置,我们如何检测并避免它?
当我在寻找这个问题的答案时,我通过Android 找到了这个页面,它告诉我们如何在Android的音频系统环境中避免优先级倒置.
java multithreading android operating-system priority-inversion
简短版本:如何从单个线程释放多个锁,而不是在中途被抢占?
我有一个程序,旨在运行在N核机器上.它由一个主线程和N个工作线程组成.每个线程(包括主线程)都有一个可以阻塞的信号量.通常,每个工作线程在递减其信号量时被阻塞,并且主线程正在运行.但是,主要的线程不时地唤醒工作线程在一定时间内完成它们的工作,然后阻塞它自己的信号量等待它们全部重新进入睡眠状态.像这样:
def main_thread(n):
for i = 1 to n:
worker_semaphore[i] = semaphore(0)
spawn_thread(worker_thread, i)
main_semaphore = semaphore(0)
while True:
...do some work...
workers_to_wake = foo()
for i in workers_to_wake:
worker_semaphore[i].increment() # wake up worker n
for i in workers_to_wake:
main_semaphore.decrement() # wait for all workers
def worker_thread(i):
while True:
worker_semaphore(i).decrement() # wait to be woken
...do some work...
main_semaphore.increment() # report done with step
Run Code Online (Sandbox Code Playgroud)
一切都很好.问题是,其中一个工作人员最终可能会在唤醒工作人员的过程中中途抢占主线程:例如,当Windows调度程序决定提高该工作人员的优先级时,就会发生这种情况.这不会导致死锁,但效率很低,因为剩余的线程一直处于睡眠状态,直到抢占工作完成其工作.它基本上是优先级倒置,主线程在其中一个worker上等待,一些工作线程在主线程上等待.
我可以为此找出特定于操作系统和调度程序的黑客攻击,例如禁用Windows下的优先级提升,以及摆弄线程优先级和处理器关联性,但我想要一些跨平台的东西,强大而干净.那么:我如何能够原子地唤醒一堆线程?