1. ホーム
  2. c++

[解決済み] boost::threadとboost::mutexをc++11の同等品に置き換えるのは賢い選択ですか?

2022-04-26 18:17:55

質問

動機:なぜ私がそれを検討しているかというと、私の天才的なプロジェクトマネージャは、boostは別の依存であり、あなたはそれに依存するので恐ろしいです"(私はboostの品質を説明しようとしたが、いくつかの時間の後にあきらめた :( ))。もっと小さな理由としては、c++11でコードを書き始める人が出てくるので、c++11の機能を学びたいからです。 というわけで。

  1. との間に1:1の対応関係があるのでしょうか? #include<thread> #include<mutex> と ブーストに相当しますか?
  2. boostのものをc++11に置き換えるのは良いアイデアだと思われますか?

    のものです。私の使い方はプリミティブなものですが、stdが使えない例というのはあるのでしょうか? を提供することができますか?あるいは(神への冒涜だが)その逆は?

P.S. GCCを使っているので、ヘッダーはあります。

解決方法は?

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_futurestd::future )
  • の引数渡しのセマンティクスは std::thread とは異なります。 boost::thread --- Boost は boost::bind これはコピー可能な引数を必要とします。 std::thread のような移動専用の型を許可しています。 std::unique_ptr を引数として渡すことができます。の使用により boost::bind のようなプレースホルダーのセマンティクスは、そのような _1 のように、ネストされたバインド式でも異なる場合があります。
  • を明示的に呼び出さない場合は join() または detach() を指定すると boost::thread デストラクタと代入演算子は detach() を、破壊/代入されるスレッドオブジェクト上で実行します。C++11 の std::thread オブジェクトの場合、これは std::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)));

Boost を使用している場合、コンパイラがサポートしていれば、比較的簡単に C++11 のスレッドに切り替えることができるでしょう(たとえば、Linux の GCC の最近のバージョンでは、C++11 のスレッドライブラリのほぼ完全な実装が、以下のように提供されています)。 -std=c++0x モード)。

もし、お使いのコンパイラがC++11スレッドをサポートしていない場合は ジャスト::スレッド しかし、これはまだ依存関係です。