動機: 私がこれを検討している理由は、私の天才的なプロジェクト マネージャーが、boost は別の依存関係であり、「それに依存している」ためひどいものだと考えているからです (boost の品質を説明しようとしましたが、しばらくして諦めました :( )。私がこれをやりたい理由は、人々がそれでコードを書き始めるので、c++11 の機能を学びたいからです。つまり、
- と boost の同等物の間に 1:1 のマッピングはありますか
#include<thread> #include<mutex>
? - boost のものを c++11 のものに置き換えるのは良い考えだと思いますか
。私の使い方は原始的ですが、std が boost の機能を提供しない例はありますか? または (冒涜的ですが) その逆ですか?
PS 私は GCC を使用しているので、ヘッダーは存在します。
ベストアンサー1
Boost.Thread と C++11 標準スレッド ライブラリにはいくつかの違いがあります。
- Boostはスレッドキャンセルをサポートしていますが、C++11スレッドはサポートしていません。
- C++11はサポートしている
std::async
が、Boostはサポートしていない boost::shared_mutex
Boostには、複数リーダー/単一ライターのロックのためのがある。類似のものはstd::shared_timed_mutex
C++14以降でのみ利用可能である(N3891)、std::shared_mutex
C++17以降でのみ利用可能(N4508)。- C++11 のタイムアウトは Boost のタイムアウトとは異なります (ただし、Boost.Chrono が受け入れられたため、これはすぐに変更されるはずです)。
- 一部の名前は異なります(例:
boost::unique_future
vsstd::future
) - の引数渡しセマンティクスは
std::thread
とは異なりますboost::thread
--- Boost は を使用しますboost::bind
。これはコピー可能な引数を必要とします。std::thread
などの移動のみの型をstd::unique_ptr
引数として渡すことができます。 の使用によりboost::bind
、ネストされたバインド式内の などのプレースホルダーのセマンティクス_1
も異なる場合があります。 join()
またはを明示的に呼び出さない場合、detach()
デストラクタboost::thread
と代入演算子は、detach()
破棄/代入されるスレッド オブジェクトを呼び出します。C++11std::thread
オブジェクトの場合、これによってが呼び出されstd::terminate()
、アプリケーションが中止されます。
移動のみのパラメータに関するポイントを明確にするために、以下は有効な C++11 であり、新しいスレッドが開始されたときに、の所有権をint
一時からstd::unique_ptr
パラメータに転送します。ただし、 を使用すると、内部的に が使用され、コピーできないため、機能しません。GCC で提供される C++11 スレッド ライブラリにも、実装でが使用されているため、これが機能しないというバグがあります。f1
boost::thread
boost::bind
std::unique_ptr
std::bind
void f1(std::unique_ptr<int>);
std::thread t1(f1,std::unique_ptr<int>(new int(42)));
Boost を使用している場合、コンパイラがサポートしていれば、比較的簡単に C++11 スレッドに切り替えることができます (たとえば、Linux 上の GCC の最新バージョンには、-std=c++0x
モードで使用可能な C++11 スレッド ライブラリのほぼ完全な実装があります)。
コンパイラがC++11スレッドをサポートしていない場合は、次のようなサードパーティの実装を入手できる可能性があります。ただ::スレッドただし、これは依然として依存関係です。