2017-05-09 81 views
1

我使用C++ 11線程,並且需要設置線程對給定處理器核心的親和性(windows'scheduler沒有智能地委託給內核,我想要控制什麼線程去往什麼核心)。跨平臺線程親和函數

對於Windows,有

SetThreadAffinityMask(GetCurrentThread(), affinity); 

什麼將一個單一的跨平臺功能的樣子,將在Windows,Linux和OSX工作,與潛在的線程庫的所有排列(窗口線程,並行線程,等等。)?

+0

您可以從STD獲取本機柄,但是從那裏,你將需要平臺的具體實現 – didiz

+0

這正是正確的 - 因此,爲什麼我問這個問題... – ibell

回答

0

如果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-upa good use case要標準化。

+0

側面說明:執行人(https://開頭github上。 com/executors/issaquah_2016)可能爲這個問題提供了更好的答案,因爲它可以讓你將硬件核心作爲「執行資源」來處理,並且你可以使用「執行程序」來創建綁定到一個或多個這些資源。但是,我不太理解這篇論文,以確保這是正確的,而且它還在演變中。 – TBBle

+0

你能否指出我已經完成了「許多應用程序無論如何已經完成它」的庫?這正是我在這個問題上所問的。我知道如何獲得native_handle,但是如果你不知道如何處理它,這不是很有用:) – ibell

+0

@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