web-dev-qa-db-ja.com

C ++ 11でstd :: thread優先度を設定するポータブルな方法

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

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

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

43
Gerdiner

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

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

同等のWindows関数はわかりませんが、必ずあるはずです。

48
Mike Seymour

私の簡単な実装...

#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);
22
marc

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

10
Dietmar Kühl

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

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

5
Rodrigo Rutsatz