web-dev-qa-db-ja.com

C ++ 11 std :: thread対Windows CreateThread

Visual C++でのスレッドの作成(および管理)に適したオプション:C++ 11 std::threadまたはWinAPI関数(CreateThread_beginthreadexなど) ) なぜ?

13
KaMyLuS

携帯性

_std::thread_はC++ 11標準の新機能です。これを使用すると、C++ 11をサポートするコンパイラ全体でC++でポータブルコードを記述できます。その中にfutureを感じることができます。

これは、C++ 11をサポートしない古いコンパイラをサポートする_boost::thread_に基づいています。これにより、他のプラットフォームへの移植がさらに簡単になります。

プラットフォーム固有のトリックを使用する必要がある場合は、 _std::thread::native_handle_ が適しています。

CreateThreadはWinAPIに固有であり、これは移植性のないコードを書くことを意味します。また、このAPIは非常に古く、使用するのがより不便です。

RAII

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スレッドを使用する理由はありません。

35
milleniumbug

クロスプラットフォームは小さなメリットです。本当の利点はインターフェースにあります。 std::threadは、スレッドのクリーンアップに関してRAII保証を提供し、関数ポインターだけでなく、任意の関数オブジェクト引数をサポートします。 std::threadはCreateThreadEXのC++ 11ラッパーであり、それは理由によるものです。

補足として、std :: threadはひどい、ひどいAPIです。自分でスレッドを作成している場合は、おそらくそれが間違っています。 IntelのTBBやMicrosoftのPPLなどの実際のスレッドAPIを使用します。これはvastlyterriblestd::threadより優れており、どういうわけかさらに悪い CreateThreadEx 。 std::threadは、「皆さん、クロスプラットフォームmmapを提供したので、独自のmallocを上に書いて楽しんでください!」のようなものです。

7
Puppy

おそらくstd::thread

std::threadは(新しい)標準の一部であり、移植可能です。

Windowsのみを対象としていて、WinAPIを使用してスレッドとやり取りする必要がある場合を除き、std::threadは進むべき道です。

3
user3160514