std::thread のインスタンスの優先順位を設定するためのC++ 11後の世界での正しい方法は何ですか?
少なくとも Windows および POSIX (Linux) 環境で動作する移植可能な方法はありますか?
それとも、ハンドルを取得して、特定の OS で利用可能なネイティブ コールを使用することですか?
std::thread のインスタンスの優先順位を設定するためのC++ 11後の世界での正しい方法は何ですか?
少なくとも Windows および POSIX (Linux) 環境で動作する移植可能な方法はありますか?
それとも、ハンドルを取得して、特定の OS で利用可能なネイティブ コールを使用することですか?
C++11 ライブラリ経由でスレッドの優先度を設定する方法はありません。これが C++14 でも変わるとは思いません。私の水晶玉はあまりにもぼんやりしていて、その後のバージョンについてコメントすることはできません。
POSIXでは、pthread_setschedparam(thread.native_handle(), policy, {priority});
Win32で BOOL SetThreadPriority(HANDLE hThread,int nPriority)
私の簡単な実装...
#include <thread>
#include <pthread.h>
#include <iostream>
#include <cstring>
class thread : public std::thread
{
public:
thread() {}
static void setScheduling(std::thread &th, int policy, int priority) {
sch_params.sched_priority = priority;
if(pthread_setschedparam(th.native_handle(), policy, &sch_params)) {
std::cerr << "Failed to set Thread scheduling : " << std::strerror(errno) << std::endl;
}
}
private:
sched_param sch_params;
};
そして、これが私の使い方です...
// create thread
std::thread example_thread(example_function);
// set scheduling of created thread
thread::setScheduling(example_thread, SCHED_RR, 2);
標準 C++ ライブラリでは、スレッドの優先度へのアクセスは定義されていません。スレッド属性を設定するには、 を使用し、たとえば POSIX システムでまたはを使用しstd::thread
ます。スレッド インターフェイスにスケジューリング属性を追加する提案があるかどうかはわかりません。native_handle()
pthread_getschedparam()
pthread_setschedparam()
Windows では、プロセスはクラスとレベルの優先度で編成されています。これを読んでください: Scheduling Priorities、スレッドとプロセスの優先度に関する全体的な知識を提供します。GetPriorityClass()、SetPriorityClass()、SetThreadPriority()、GetThreadPriority()の関数を使用して、優先度を動的に制御することもできます。
どうやら、Windows システムで、またはWindows システムで を使用することもできstd::thread
ます。この例std::thread: Native Handleを確認し、追加されたヘッダーに注意してください!native_handle()
pthread_getschedparam()
pthread_setschedparam()