- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我只是想知道 C++11 中是否有任何锁定策略可以防止线程饥饿。
我有一堆线程在争夺一个互斥量。现在,我的问题是离开关键部分的线程立即开始竞争同一个互斥锁,并且大多数时候获胜。因此,等待互斥量的其他线程正在挨饿。
我不想让离开关键部分的线程休眠一些最短的时间,让其他线程有机会锁定互斥量。
我认为一定有一些参数可以为等待互斥锁的线程启用公平锁定,但我找不到任何合适的解决方案。
好吧,我找到了 std::this_thread::yield() 函数,它假设重新安排线程执行的顺序,但它只是对调度程序线程的提示,并且是否重新安排线程取决于调度程序线程的实现。
有什么方法可以为 C++11 中等待同一互斥锁的线程提供公平的锁定策略吗?通常的策略是什么?
谢谢
最佳答案
这是互斥锁中的一个常见优化,旨在避免在同一线程可以再次获取互斥锁时浪费时间切换任务。如果当前线程在其时间片中仍有剩余时间,那么通过让它获取互斥量而不是挂起它并切换到另一个线程(这可能会导致高速缓存行的大量重新加载和各种其他延迟)。
如果您对互斥锁的争用太多以至于这是一个问题,那么您的应用程序设计是错误的。您将所有这些线程都阻塞在互斥锁上,因此什么都不做:没有那么多线程可能会更好。
您应该设计您的应用程序,以便如果多个线程竞争互斥锁,那么哪个线程获得锁并不重要。直接争用也应该是很少见的事情,尤其是有很多线程的直接争用。
我认为这是一个 OK 场景的唯一情况是每个线程都在等待一个条件变量,然后广播以唤醒它们。然后每个线程都会争用互斥锁,但如果你这样做是对的,那么它们都应该快速检查这不是虚假唤醒,然后释放互斥锁。即便如此,这也被称为“雷霆万钧”的情况,并不理想,正是因为它序列化了所有这些线程。
关于c++ - 如何在 C++11 中防止线程饥饿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15910759/
我是一名优秀的程序员,十分优秀!