- 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/
考虑以下服务器: public class TestServer { public static void main(String[] args) { String ksName = "/so
我正在研究工作队列处理器的设计,其中 QueueProcessor 从队列中检索命令模式对象并在新线程中执行它。 我正在尝试解决嵌套命令可能导致死锁的潜在队列锁定场景。 例如 一个 FooComman
通过使用 UNIX 管道进行进程同步,我们是否会陷入饥饿?例如: void pipesem_wait(struct pipesem *sem) { char onebyte = 'A';
这是使用 Scala 2.8 Actors。我有一个可以并行化的长时间运行的工作。它由大约 650,000 个工作单元组成。我将它分成 2600 个不同的独立子任务,并为每个子任务创建一个新角色: a
回答问题:Task.Yield - real usages?我建议使用 Task.Yield 允许池线程被其他任务重用。在这样的模式中: CancellationTokenSource cts;
我是一名优秀的程序员,十分优秀!