5

std::threadオブジェクトがある場合は、基になるスレッド実装(pthreadやWindowsスレッドなど)のAPIにアクセスするためにt使用できます。t.native_handle()しかし、基になるスレッド実装(pthreadsスレッドなど)からのハンドルがある場合はどうなりますか。それをC++11に変換する方法はありますstd::threadか?

この動機は、ネイティブプラットフォームのスレッドAPIを使用して、特定のアフィニティや特定のスタックサイズ(またはC ++ 11 APIを介してアクセスできないその他の特性)を使用してスレッドを設定することが望ましい場合があることです。 )。ただし、その時点からは、C++11の機能に固執するのがよいでしょう。

これを行う方法はありますか?

4

1 に答える 1

6

GCCを使用すると、からを構築できますが、std::thread::idからstd::thread::native_handle_type構築することはできませんstd::thread

つまり、特定のスレッドがオブジェクト(または)pthread_tと同じスレッドを参照しているかどうかをテストできますが、そこから新しいオブジェクトを作成することはできません。std::threadthis_thread::get_id()thread

Aは、スレッドに対する一意のstd::threadハンドルになるように設計されています。別のオブジェクトが基になるスレッドの所有権を取得する唯一の方法は、元のスレッドからオブジェクトを移動することです。したがって、一度に1つのオブジェクトだけがそのスレッドを「所有」します。ネイティブハンドルからそれらを構築できる場合は、次のことができます。thread

// start new thread
std::thread t(&thread_func);

// now have two handles to the same thread
std::thread t2( t.native_handle() );

std::thread t1.join();

// erm, hang on, this isn't right
std::thread t2.join();

この動機は、ネイティブプラットフォームのスレッドAPIを使用して、特定のアフィニティや特定のスタックサイズ(またはC ++ 11 APIを介してアクセスできないその他の特性)を使用してスレッドを設定することが望ましい場合があることです。 )。

理想的には、プラットフォームでは、スレッドを構築するときにアフィニティやスタックサイズなどのパラメータを指定できます。これにより、「非所有」threadオブジェクトを構築することで型システムを弱めることなく、これらのプラットフォーム固有の機能を使用できます...ただし、少なくともGCCはそれをサポートしていません。

于 2012-11-13T00:31:02.277 に答える