1. 程式人生 > >std::this_thread::yield()使用理解

std::this_thread::yield()使用理解

std::this_thread::yield tells the implementation to reschedule the execution of threads,
that should be used in a case where you are in a busy waiting state, like in a thread pool:

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 can be used if you really want to wait for a specific amount of time.
This can be used for task, where timing really matters, e.g.: if you really only want to wait for
2 seconds. (Note that the implementation might wait longer than the given time duration)

個人理解:
(1)

std::this_thread::yield(); 是將當前執行緒所搶到的CPU”時間片A”讓渡給其他執行緒(其他執行緒會爭搶”時間片A”,
注意: 此時”當前執行緒”不參與爭搶).
等到其他執行緒使用完”時間片A”後, 再由作業系統排程, 當前執行緒再和其他執行緒一起開始搶CPU時間片.

(2) 如果將 std::this_thread::yield();上述語句修改為: return; ,則將未使用完的CPU”時間片A”還給作業系統, 再由作業系統排程, 當前執行緒和其他執行緒一起開始搶CPU時間片.

std::this_thread::yield(): 適合應用在 — “that should be used in a case where you are in a busy waiting state”, 如果存在此情況, 執行緒實際的執行程式碼類似如下:

void thread_func()
{
    while (1)
    {
        if (!HasTask())
        {
            return;
        }
       // else
       // {
       //     // do work
       // }
    }
}

因為條件不滿足, 所以此執行緒很快就返回(然後立即與其他執行緒競爭CPU時間片), 結果就是此執行緒頻繁的與其他執行緒爭搶CPU時間片, 從而影響程式效能,使用 std::this_thread::yield() 後, 就相當於”當前執行緒”檢查條件不成功後, 將其未使用完的”CPU時間片”分享給其他執行緒使用, 等到其他執行緒用完後, 再和其他執行緒一起競爭.

結論:
std::this_thread::yield() 的目的是避免一個執行緒(that should be used in a case where you are in a busy waiting state)頻繁與其他執行緒爭搶CPU時間片, 從而導致多執行緒處理效能下降.

std::this_thread::yield() 是讓當前執行緒讓渡出自己的CPU時間片(給其他執行緒使用)
std::this_thread::sleep_for() 是讓當前休眠”指定的一段”時間.

sleep_for()也可以起到 std::this_thread::yield()相似的作用, (即:當前執行緒在休眠期間, 自然不會與其他執行緒爭搶CPU時間片)但兩者的使用目的是大不相同的:
std::this_thread::yield() 是讓執行緒讓渡出自己的CPU時間片(給其他執行緒使用)
sleep_for() 是執行緒根據某種需要, 需要等待若干時間.