別の SO スレッドthread::native_handle
では、C++ スレッド化 API の外部にある処理 (スレッドの優先順位の設定など)を使用する方法について説明しています。要点は次のとおりです。
std::thread t(functionToRun);
auto nh = t.native_handle());
// configure t using nh
このアプローチの問題は、functionToRun
t を構成するコードが完了する前に、任意の時間 (完了までを含む) 実行される可能性があることです。
次のようにして、それを防ぐことができると思います(テストされていません):
std::atomic<bool> configured(false);
std::thread t([&]{ while (!configured); // spin until configured is true
functionToRun(); });
auto nh = t.native_handle();
// configure t using nh
configured = true;
残念ながら、これにより、生成されたスレッドconfigured
が true になるのを待ってスピンします。構成が完了するまで、生成されたスレッドをブロックすることが望ましいでしょう。
それを達成する1つの方法は、ミューテックスを使用することです(これもテストされていません):
std::mutex m;
std::unique_lock<std::mutex> lock(m);
std::thread t([&]{ std::lock_guard<std::mutex> lg(m); // block until m available
functionToRun(); });
auto nh = t.native_handle();
// configure t using nh
lock.unlock(); // allow t to continue
これは機能するはずですが、概念的には、条件 (構成が完了) がいつ満たされるかを示す仕事には condvar の方が適しているようです。しかし、condvar を使用するには、上記のすべてに加えて condvar が必要であり、偽の wakes の可能性に対処する必要があります。これは、私の知る限り、ミューテックスの問題ではありません。
スレッドを生成してすぐに停止し、ネイティブ ハンドルを使用してそれを構成してから実行できるようにする、より良い方法はありますか?