Tom*_*cek 7 c++ multithreading locking c++11
我只是想知道C++ 11中是否有任何锁定策略可以防止线程饥饿.
我有一堆线程正在竞争一个互斥锁.现在,我的问题是,离开临界区的线程立即开始竞争相同的互斥锁,并且大部分时间都获胜.因此,等待互斥锁的其他线程正在挨饿.
我不想让线程,留下一个关键部分,睡眠一段时间,让其他线程有机会锁定互斥锁.
我认为必须有一些参数可以为等待互斥锁的线程启用公平锁定,但我无法找到任何合适的解决方案.
好吧,我找到了std :: this_thread :: yield()函数,它假设重新调度线程执行的顺序,但它只提示调度程序线程,如果重新调度线程,则依赖于调度程序线程实现.
有没有办法如何为在C++ 11中等待相同互斥锁的线程提供公平锁定策略?通常的策略是什么?
谢谢
这是互斥体中的常见优化,旨在避免在同一线程再次使用互斥锁时浪费时间切换任务.如果当前线程在其时间片中仍有剩余时间,那么通过让它使用互斥锁而不是挂起它,并切换到另一个线程(这可能会导致大量重新加载缓存行和各种其他延迟).
如果您对互斥锁有如此多的争用,那么这是一个问题,那么您的应用程序设计是错误的.你在互斥锁上阻塞了所有这些线程,因此没有做任何事情:如果没有这么多线程,你可能会更好.
您应该设计应用程序,以便在多个线程争用互斥锁时,哪个线程获得锁定无关紧要.直接争用也应该是一种罕见的事情,特别是与大量线程的直接争用.
我认为这是一个好的场景的唯一情况是每个线程都在等待条件变量,然后广播以唤醒它们.然后每个线程都会争用互斥锁,但如果你这样做,那么他们都应该快速检查这不是一个虚假的唤醒,然后释放互斥锁.即便如此,这被称为"雷鸣般的群体"情况,并不理想,正是因为它序列化了所有这些线程.
| 归档时间: |
|
| 查看次数: |
3799 次 |
| 最近记录: |