Boost.ThreadとC ++ 11標準スレッドライブラリにはいくつかの違いがあります。
- Boostはスレッドのキャンセルをサポートしていますが、C ++ 11スレッドはサポートしていません
- C ++ 11はをサポートしています
std::asyncが、Boostはサポートしていません
- Boostには、
boost::shared_mutex複数のリーダー/単一のライターのロックがあります。類似のものstd::shared_timed_mutexはC ++ 14(N3891)std::shared_mutex以降でのみ利用可能ですが、C ++ 17(N4508)以降でのみ利用可能です。
- C ++ 11タイムアウトは、Boostタイムアウトとは異なります(ただし、Boost.Chronoが受け入れられたため、すぐに変更されるはずです)。
- 名前の一部が異なります(例:
boost::unique_futurevs std::future)
- の引数渡しのセマンティクス
std::threadは異なりますboost::thread--- Boostはboost::bind、コピー可能な引数を必要とするを使用します。std::threadなどの移動のみのタイプstd::unique_ptrを引数として渡すことができます。の使用によりboost::bind、_1ネストされたバインド式などのプレースホルダーのセマンティクスも異なる場合があります。
- 明示的に呼び出さない場合、
join()またはデストラクタと割り当て演算子は、破棄/割り当て先のスレッドオブジェクトを呼び出します。C ++ 11 オブジェクトを使用すると、アプリケーションが呼び出され、アプリケーションが異常終了します。detach()boost::threaddetach()std::threadstd::terminate()
移動のみのパラメーターに関する要点を明確にするために、以下は有効なC ++ 11でありint、一時的なものstd::unique_ptrからf1新しいスレッドが開始されるときのパラメーターにの所有権を転送します。ただし、内部boost::threadで使用するboost::bindため、使用してstd::unique_ptrも機能せず、コピーできません。GCCで提供されているC ++ 11スレッドライブラリにもバグがありstd::bind、実装で使用されているため、この動作を妨げています。
void f1(std::unique_ptr<int>);
std::thread t1(f1,std::unique_ptr<int>(new int(42)));
ブーストを使用している場合、コンパイラがサポートしていれば、おそらく比較的簡単にC ++ 11スレッドに切り替えることができます(たとえば、Linux上のGCCの最近のバージョンには、-std=c++0xモードで使用できるC ++ 11スレッドライブラリのほぼ完全な実装があります)。
コンパイラがC ++ 11スレッドをサポートしていない場合、Just :: Threadなどのサードパーティの実装を取得できる可能性がありますが、これは依然として依存関係です。