我使用C++ 11線程,並且需要設置線程對給定處理器核心的親和性(windows'scheduler沒有智能地委託給內核,我想要控制什麼線程去往什麼核心)。跨平臺線程親和函數
對於Windows,有
SetThreadAffinityMask(GetCurrentThread(), affinity);
什麼將一個單一的跨平臺功能的樣子,將在Windows,Linux和OSX工作,與潛在的線程庫的所有排列(窗口線程,並行線程,等等。)?
我使用C++ 11線程,並且需要設置線程對給定處理器核心的親和性(windows'scheduler沒有智能地委託給內核,我想要控制什麼線程去往什麼核心)。跨平臺線程親和函數
對於Windows,有
SetThreadAffinityMask(GetCurrentThread(), affinity);
什麼將一個單一的跨平臺功能的樣子,將在Windows,Linux和OSX工作,與潛在的線程庫的所有排列(窗口線程,並行線程,等等。)?
如果C++的一部分,我懷疑這會看起來像一對成員函數:
std::error_code std::thread::hardware_affinity(const std::vector<bool>&);
和免費功能:
std::error_code std::this_thread::hardware_affinity(const std::vector<bool>&);
的假設,我們正在談論與std::thread::hardware_concurrency()
計算的資源大致相同,並且std::thread
實現必須已經處理「底層線程庫的所有排列」。
使用工具庫自己建立一個,或(我不能說出一個現有的現在)它可能看起來像:
thread_utils::hardware_affinity(std::thread::native_handle_type, const std::vector<bool>&)
但它必須在內部支持所有的排列。這並不是非常困難(許多應用程序無論如何都是這樣做的),但它的工作量比堆棧溢出(Stack Overflow)答案所能容納的要多。^_^
這種方法的一個令人討厭的限制是,雖然有成員函數std::thread::native_handle()
,但沒有std::this_thread::native_handle()
方法。這基本上是pending a write-up和a good use case要標準化。
側面說明:執行人(https://開頭github上。 com/executors/issaquah_2016)可能爲這個問題提供了更好的答案,因爲它可以讓你將硬件核心作爲「執行資源」來處理,並且你可以使用「執行程序」來創建綁定到一個或多個這些資源。但是,我不太理解這篇論文,以確保這是正確的,而且它還在演變中。 – TBBle
你能否指出我已經完成了「許多應用程序無論如何已經完成它」的庫?這正是我在這個問題上所問的。我知道如何獲得native_handle,但是如果你不知道如何處理它,這不是很有用:) – ibell
@ibell快速代碼搜索['SetThreadAffinityMask''pthread_setaffinity_np'](https://searchcode.com /?q = SetThreadAffinityMask + pthread_setaffinity_np)給了我:[來自Dolphin仿真器(GPL2)的Thread.cpp](https://searchcode.com/file/92960692/Source/Core/Common/Thread.cpp),稍後命中我指向[LuaSys線程庫](https://github.com/tnodir/luasys/tree/master/src/thread)。 – TBBle
您可以從STD獲取本機柄,但是從那裏,你將需要平臺的具體實現 – didiz
這正是正確的 - 因此,爲什麼我問這個問題... – ibell