Visual C++でのスレッドの作成(および管理)に適したオプション:C++ 11 std::thread
またはWinAPI
関数(CreateThread
、_beginthreadex
など) ) なぜ?
_std::thread
_はC++ 11標準の新機能です。これを使用すると、C++ 11をサポートするコンパイラ全体でC++でポータブルコードを記述できます。その中にfuture
を感じることができます。
これは、C++ 11をサポートしない古いコンパイラをサポートする_boost::thread
_に基づいています。これにより、他のプラットフォームへの移植がさらに簡単になります。
プラットフォーム固有のトリックを使用する必要がある場合は、 _std::thread::native_handle
_ が適しています。
CreateThread
はWinAPIに固有であり、これは移植性のないコードを書くことを意味します。また、このAPIは非常に古く、使用するのがより不便です。
WinAPIは、最新の C++goodpractices を推奨しないC APIです。作成するすべてのスレッドプリミティブは、後で手動で破棄する必要があります。
これはC++ 11のスレッドライブラリには当てはまりません。これにより、高レベルの抽象化を簡単に記述できます。 _std::thread
_はまだかなり低レベルですが(スレッド.join()
または.detach()
、またはスレッドデストラクタがプログラムを終了します)、C++ 11スレッドライブラリはmutexのRAIIをサポートするための_std::lock_guard
_およびその他のロッククラス。
C++ 11には、関数を非同期で起動するための_std::async
_などのいくつかの高レベルの抽象化がありますが、スレッドプールなどの他の抽象化は提供されないため、他のライブラリを使用することもできます。
WinAPIは、特定のシグネチャを持つ関数ポインターのみを呼び出すことができます。これは、型の安全性、オブジェクトの寿命、およびメモリの誤った管理に関連するバグの傾向があります。
_std::thread
_は、呼び出し可能な任意のオブジェクトを呼び出すことができます。
_// call free-standing function in a separate thread
std::thread first(func);
// call free-standing function with arguments (1, 2), in a separate thread
std::thread second(func, 1, 2);
// call static member function in a separate thread
std::thread third(&A::static_memfun);
// call non-static member of a temporary in a separate thread
std::thread fourth(&A::memfun, A());
//call std::function in a separate thread
std::function<void(int)> callback = std::bind(func, 1, _1);
std::thread fifth(callback, 2);
// call a function object
Functor f;
std::thread sixth(f);
_
TL; DR:新しいC++コードでメインスレッドメカニズムとしてWinAPIスレッドを使用する理由はありません。
クロスプラットフォームは小さなメリットです。本当の利点はインターフェースにあります。 std::thread
は、スレッドのクリーンアップに関してRAII保証を提供し、関数ポインターだけでなく、任意の関数オブジェクト引数をサポートします。 std::thread
はCreateThreadEXのC++ 11ラッパーであり、それは理由によるものです。
補足として、std :: threadはひどい、ひどいAPIです。自分でスレッドを作成している場合は、おそらくそれが間違っています。 IntelのTBBやMicrosoftのPPLなどの実際のスレッドAPIを使用します。これはvastlyterriblestd::thread
より優れており、どういうわけかさらに悪い CreateThreadEx 。 std::thread
は、「皆さん、クロスプラットフォームmmap
を提供したので、独自のmalloc
を上に書いて楽しんでください!」のようなものです。
おそらくstd::thread
。
std::thread
は(新しい)標準の一部であり、移植可能です。
Windowsのみを対象としていて、WinAPIを使用してスレッドとやり取りする必要がある場合を除き、std::thread
は進むべき道です。