std :: this_thread :: yield只是一个提示有问题吗?

NoS*_*tAl 1 c++ c++11 stdthread stdatomic

同事和我讨论了一个假想的问题,当一个人想要实现自旋锁互斥std::atomic_flag,但也实现那个自旋锁而不是(真)但作为一个

while(true)
{
     cnt=0;
     while (cnt<yieldAfterTries)
     {
        //try to get lock
        cnt++;
     }
     std::this_thread::yield();

     // if got lock do work and then break;
}     
Run Code Online (Sandbox Code Playgroud)

基本上的想法是线程不能"很长一段时间"阻止其他人,即使它有一个实时优先级,因为它会在一段时间后产生...但是当我看到std :: yield的规范时我很惊讶它是一个建议,不是强制性的.

提供实现的提示,以重新安排线程的执行,允许其他线程运行.

http://en.cppreference.com/w/cpp/thread/yield

那会有问题吗?

How*_*ant 6

我编写的代码与您的代码非常相似,并测量了yield在高争用条件下调用的影响.我发现yield以这种方式使用对整体系统吞吐量有益.

实际规范在精神上与引用的内容没有什么不同,但这里是30.3.2 [thread.thread.this]第2和第3段的确切规范:

void this_thread::yield() noexcept;
Run Code Online (Sandbox Code Playgroud)

效果:为实施提供重新安排的机会.

同步:无.

如果实现实现yield为无操作(例如),则这将仅影响代码的性能而不影响正确性.失败的自旋锁最终会被抢占,即使没有yield.但它也更有可能不必要地占用CPU,降低整体系统性能.