【发布时间】:2013-01-18 15:40:04
【问题描述】:
我和同事讨论了一个假设问题,当人们想用 std::atomic_flag 实现自旋锁互斥锁,但也不是将自旋锁实现为 while(true) 而是作为一个
while(true)
{
cnt=0;
while (cnt<yieldAfterTries)
{
//try to get lock
cnt++;
}
std::this_thread::yield();
// if got lock do work and then break;
}
基本上的想法是,即使线程具有实时优先级,线程也不能“在很长一段时间内”阻塞其他线程,因为它会在一段时间后屈服……但是当我看到 std::yield 的规范我很惊讶这是一个建议,而不是强制性的。
为实现提供提示以重新安排 线程,允许其他线程运行。
http://en.cppreference.com/w/cpp/thread/yield
那会有问题吗?
【问题讨论】:
-
没有。如果您的程序依赖于
sched_yield或this_thread::yield或类似的正确性,那么它已经损坏了。 -
@JonathanWakely 那么问题是尝试自旋锁块的高优先级线程能否无限期地阻塞其他低优先级线程(其中一个持有锁)......我想这是一个关于调度程序的问题。 :)
-
是的,它是关于调度程序的,而 C++ 无法指定这一点,因此它实际上不能要求
yield()提供任何比它作为提示更强大的东西。
标签: c++ c++11 stdthread stdatomic