boost::thread と boost::mutex を c++11 の同等のものに置き換えるのは賢明でしょうか? 質問する

boost::thread と boost::mutex を c++11 の同等のものに置き換えるのは賢明でしょうか? 質問する

動機: 私がこれを検討している理由は、私の天才的なプロジェクト マネージャーが、boost は別の依存関係であり、「それに依存している」ためひどいものだと考えているからです (boost の品質を説明しようとしましたが、しばらくして諦めました :( )。私がこれをやりたい理由は、人々がそれでコードを書き始めるので、c++11 の機能を学びたいからです。つまり、

  1. と boost の同等物の間に 1:1 のマッピングはありますか#include<thread> #include<mutex>?
  2. boost のものを c++11 のものに置き換えるのは良い考えだと思いますか
    。私の使い方は原始的ですが、std が boost の機能を提供しない例はありますか? または (冒涜的ですが) その逆ですか?

PS 私は GCC を使用しているので、ヘッダーは存在します。

ベストアンサー1

Boost.Thread と C++11 標準スレッド ライブラリにはいくつかの違いがあります。

  • Boostはスレッドキャンセルをサポートしていますが、C++11スレッドはサポートしていません。
  • C++11はサポートしているstd::asyncが、Boostはサポートしていない
  • boost::shared_mutexBoostには、複数リーダー/単一ライターのロックのためのがある。類似のものはstd::shared_timed_mutexC++14以降でのみ利用可能である(N3891)、std::shared_mutexC++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()またはを明示的に呼び出さない場合、detach()デストラクタboost::threadと代入演算子は、detach()破棄/代入されるスレッド オブジェクトを呼び出します。C++11std::threadオブジェクトの場合、これによってが呼び出されstd::terminate()、アプリケーションが中止されます。

移動のみのパラメータに関するポイントを明確にするために、以下は有効な C++11 であり、新しいスレッドが開始されたときに、の所有権をint一時からstd::unique_ptrパラメータに転送します。ただし、 を使用すると、内部的に が使用され、コピーできないため、機能しません。GCC で提供される C++11 スレッド ライブラリにも、実装でが使用されているため、これが機能しないというバグがあります。f1boost::threadboost::bindstd::unique_ptrstd::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スレッドをサポートしていない場合は、次のようなサードパーティの実装を入手できる可能性があります。ただ::スレッドただし、これは依然として依存関係です。

おすすめ記事