69

std::thread のインスタンスの優先順位を設定するためのC++ 11後の世界での正しい方法は何ですか?

少なくとも Windows および POSIX (Linux) 環境で動作する移植可能な方法はありますか?

それとも、ハンドルを取得して、特定の OS で利用可能なネイティブ コールを使用することですか?

4

5 に答える 5

66

C++11 ライブラリ経由でスレッドの優先度を設定する方法はありません。これが C++14 でも変わるとは思いません。私の水晶玉はあまりにもぼんやりしていて、その後のバージョンについてコメントすることはできません。

POSIXでは、pthread_setschedparam(thread.native_handle(), policy, {priority});

Win32 BOOL SetThreadPriority(HANDLE hThread,int nPriority)

于 2013-09-19T01:32:15.017 に答える
40

私の簡単な実装...

#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);
于 2015-07-27T11:49:01.953 に答える
16

標準 C++ ライブラリでは、スレッドの優先度へのアクセスは定義されていません。スレッド属性を設定するには、 を使用し、たとえば POSIX システムでまたはを使用しstd::threadます。スレッド インターフェイスにスケジューリング属性を追加する提案があるかどうかはわかりません。native_handle()pthread_getschedparam()pthread_setschedparam()

于 2013-09-19T01:12:44.447 に答える
10

Windows では、プロセスはクラスとレベルの優先度で編成されています。これを読んでください: Scheduling Priorities、スレッドとプロセスの優先度に関する全体的な知識を提供します。GetPriorityClass()SetPriorityClass()SetThreadPriority()GetThreadPriority()の関数を使用して、優先度を動的に制御することもできます。

どうやら、Windows システムで、またはWindows システムで を使用することもできstd::threadます。この例std::thread: Native Handleを確認し、追加されたヘッダーに注意してください!native_handle()pthread_getschedparam()pthread_setschedparam()

于 2014-11-10T16:20:57.963 に答える