std::this_thread::yield()与std::this_thread::sleep_for()的区别

68
C++11中std::this_thread::yield()std::this_thread::sleep_for()有什么区别?如何决定使用哪一个?

1
那里似乎没有得到答案。 - polapts
1
yield 不会抛出异常。sleep_for 可能会抛出异常。 - dirkgently
1
@dirkgently sleep_for 也不会抛出异常,如果 chrono::duration 类型不抛出异常的话,这对于标准类型来说是正确的,详见30.3.2.9。 - Stephan Dollberg
2
注意:在程序中使用Yields是一个不好的迹象。基本上这意味着你没有足够的同步(即你没有真正跟踪谁在等待资源,谁负责唤醒等待者)。 - Neeraj Singh
显示剩余3条评论
2个回答

50

std::this_thread::yield 的作用是让程序重新调度线程的执行,该函数通常用于忙等待状态下,例如在线程池中:

...
while(true) {
  if(pool.try_get_work()) {
    // do work
  }
  else {
    std::this_thread::yield(); // other threads can push work to the queue now
  }
}

std::this_thread::sleep_for 可以用于在特定的时间内等待,这可以用于那些时间非常关键的任务中,例如:如果你只想等待2秒钟。请注意,该实现可能会比给定的时间长。


那么,这是否意味着std::this_thread::yield会放弃执行一段时间,然后再尝试?线程如何确定下次尝试的时间? - polapts
10
是的,std::this_thread::yield 只是让调度程序去执行另一个线程。当调度程序回到这个线程时,它会在调用 std::this_thread::yield 后继续工作。 - Stephan Dollberg

26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接