簡體   English   中英

放棄CPU時間

[英]Abandoning CPU time

在C / C ++中,是否可以“放棄”線程的CPU時間? 例如:

void wait(int s) //Low cpu usage
{
 int tmp = time();
 while(tmp + CLOCKS_PER_SEC * s > time())
  __AbandonCPUTime();
  //Tell cpu to do sth else.
}

我已經嘗試過Sleep(0),但是它不起作用。

看看C ++ 11:

#include <thread>
std::this_thread::yield();

您的CPU可能支持_mm_pause()內在函數(gcc的__asm__("pause") )可能會也可能不會幫助您。

否則,你將着眼於操作系統的特定功能: sched_yield()在Linux或並行線程SwitchToThread()在Windows

編輯以更直接地回答問題:您應該等待一些東西(WaitForSingleObject或GetMessage或其他等效的東西),或者,如果沒有事件可以等待Sleep(非零)毫秒數。

Sleep(0)通常會立即返回,因此您仍然會消耗大量能量並耗盡用戶的電池或提高他們的電費。 Sleep(1)仍然很爛,但是它比Sleep(0),_ mm_pause(),sched_yield()或SwitchToThread()好幾個數量級。

如果有一個正在等待運行,則Windows上的Sleep(0)將產生另一個優先級相同的線程。 這很少有用,因為特別是在動態調整線程優先級的情況下,您永遠無法判斷是否存在另一個具有相同優先級的線程。 Sleep(0)通常不會切換到優先級更高的線程,因為該線程(優先級更高)已經在運行。 而且它不會切換到優先級較低的線程,因為它不會。 SwitchToThread也有類似的問題。

_mm_pause()告訴CPU空閑幾個周期。 這樣可以降低功耗,並在超線程計算機上使該內核上的其他線程運行得更快。 但是,這通常不是您應該做的事情。

如果要在n毫秒內喚醒,請調用Sleep(n)。 或者,更好的是,等待特定事件。

諸如sched_yield,Sleep(0)和SwitchToThread之類的功能通常都是不好的主意,因為它們不會告訴操作系統何時要再次運行。

無論您做什么,都不會忙於等待,即使使用_mm_pause。 http://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

sched_yield()導致調用線程放棄CPU。

http://www.kernel.org/doc/man-pages/online/pages/man2/sched_yield.2.html

僅供參考,英特爾已經發布了兩種有關如何做所需的最佳實踐,並且大多數情況下是通過使用_mm_pause() 請注意,他們的第6代等待周期時間有意增加,因此您需要結合以下文章中描述的內容:

https://software.intel.com/zh-CN/articles/a-common-construct-to-avoid-the-contention-of-threads-architecture-agnostic-spin-wait-loops

https://software.intel.com/zh-CN/articles/benefitting-power-and-performance-sleep-loops

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM