2008-11-13 60 views
1

我有兩個系統調用GetSystemTime()和GetThreadTimes(),我需要通過給定的Win32線程來計算CPU利用率。爲了準確起見,我需要確保GetSystemTime()和GetThreadTimes()都是以原子方式執行的;即在GetSystemTime()的調用之間不應該有上下文切換()& GetThreadTimes()。Win32:代碼塊的原子執行

原因是偶爾我最終的比例超過了100%(約500分之一)。

如何確保2個函數調用的原子執行?

感謝, 薩欽

+0

有沒有辦法直接查詢Windows線程的CPU利用率? – rmeador 2008-11-13 22:04:45

回答

2

最好的辦法是將計算線程分配給實時優先級。實時線程只能被其他實時線程搶佔(或被實時優先級提升的線程)。

+0

這仍然是可中斷的。 – CPerkins 2013-06-04 12:48:38

2

我不敢相信你能應付。除非你知道每個函數中的底層操作是什麼,並且因爲它們碰巧是Windows API調用......祝你好運。

難道只能調整百分比超過100嗎?

perc = (perc > 100.0f) ? 100.0f : perc; 
1

可悲的是沒有辦法。在Win32中的兩次系統調用之間,無法阻止進程/線程被上下文切換。否則,對於某個人來說,實施一個通過拒絕每一次切換而鎖定系統的進程都是微不足道的。

1

以相反的順序調用函數有幫助嗎? (99%優於101%...)

此外,如果您在執行此操作之前強制切換上下文(例如調用Sleep()),您可能會減少切換的機會。我不知道這樣做會有多好。