11

Boost Thread ライブラリは java.util.concurrent ライブラリと比べてどうですか?

パフォーマンスは非常に重要なので、私は C++ を使い続けることを好みます (最近では Java の方がはるかに高速ですが)。C++ でコーディングする必要があることを考えると、スレッド化を容易にし、エラーを起こしにくくするためにどのようなライブラリが存在しますか?

最近、JDK 1.5 の時点で Java メモリ モデルが変更され、同時実行性の問題が修正されたと聞きました。C++はどうですか?私が最後に C++ でマルチスレッド プログラミングを行ったのは、pthreads を使用した 3 ~ 4 年前のことです。ただし、大規模なプロジェクトにはもう使用したくありません。私が知っている唯一の他の選択肢は、Boost Threads です。しかし、それが良いかどうかはわかりません。java.util.concurrent については良いことを聞いたことがありますが、Boost スレッドについてはまだ何も聞いていません。

4

6 に答える 6

12

java.util.concurrentとブーストスレッドライブラリには重複する機能がありますが、java.util.concurrentは、a)高レベルの抽象化とb)低レベルの関数も提供します。

ブーストスレッドは以下を提供します:

java.util.concurrentには次のものもあります。

補足:C++には現在メモリモデルがありません。別のマシンでは、同じC++アプリケーションが別のメモリモデルを処理する必要がある場合があります。これにより、C++での移植可能な並行プログラミングがさらに難しくなります。

于 2009-12-26T13:18:54.303 に答える
11

ブースト スレッドは pthread よりもはるかに使いやすく、私の意見では、Java スレッドよりもわずかに使いやすいです。ブースト スレッド オブジェクトがインスタンス化されると、新しいスレッドが起動されます。ユーザーは、その新しいスレッドで実行される関数または関数オブジェクトを提供します。

それは本当に次のように簡単です:

boost::thread* thr = new boost::thread(MyFunc());
thr->join();

関数オブジェクト内に値を格納することで、スレッドにデータを簡単に渡すことができます。また、boost の最新バージョンでは、可変数の引数をスレッド コンストラクター自体に渡すことができます。これは、関数オブジェクトの()演算子に渡されます。

boost::mutex同期のために で RAII スタイルのロックを使用することもできます。

C++0x は に対して同じ構文を使用することに注意してくださいstd::thread

于 2009-11-18T21:05:34.933 に答える
7

パフォーマンスに関しては、私は本当に心配しません。Boost/C++ の専門家は、Java の専門家よりも高速なコードを記述できるというのが私の直感です。しかし、どんな利点でも戦わなければならないでしょう。

私は Java よりも Boost の設計パラダイムを好みます。Java はどこまでも OO であり、Boost/C++ は必要に応じて OO を許可しますが、目前の問題に対して最も有用なパラダイムを使用します。特に、ロックを扱うときは RAII が大好きです。Java はメモリ管理を見事に処理しますが、ファイル ハンドル、ミューテックス、DB、ソケットなど、プログラマの残りのリソースが使い果たされているように感じることがあります。

Java の並行ライブラリは、Boost のものよりも広範です。スレッド プール、並行コンテナー、アトミックなど。ただし、コア プリミティブは、スレッド、ミューテックス、条件変数など、互いに同等です。

だからパフォーマンスのために私はそれがウォッシュだと思います. 多数の高レベルの並行ライブラリ サポートが必要な場合は、Java が勝ちます。パラダイムの自由を好むなら C++。

于 2009-11-18T22:06:52.167 に答える
4

マルチスレッド プログラムでパフォーマンスが問題になる場合は、ロックのない設計を検討する必要があります。
ロックフリーとは、スレッドが共有リソースをめぐって競合しないことを意味し、切り替えコストを最小限に抑えます。その部門では、同時コレクションを備えたJavaの方が優れた話です。ロックのないソリューションをすぐに思いつくことができます。
Boost Thread lib を少し (ただし広範囲ではありません) 使用したことで、あなたの考え方は利用可能なものに影響されると言えます。つまり、基本的にロック ソリューションを意味します。
ロックフリーの C++ ソリューションを作成することは非常に困難です。これは、ライブラリ サポートが不足していることと、概念的にも、真に不変なオブジェクトを作成できることを保証するメモリ モデルが欠落しているためです。

この本は必読です: Java Concurrency in Practice

于 2011-05-11T17:58:20.700 に答える
1

特定のプラットフォームをターゲットにしている場合、直接OS呼び出しは、C++用のboostを使用するよりもおそらく少し速くなります。私はACEを使用する傾向があります。これは、通常、メインプラットフォームに対して適切な呼び出しを行うことができ、それでもプラットフォームに依存しないためです。Javaは、最新バージョンで実行されることを保証できる限り、ほぼ同じ速度である必要があります。

于 2009-11-18T20:09:24.617 に答える
0

C++ では、必要に応じて pthreads (pthread_create() など) を直接使用できます。内部的には、Java はランタイム環境を介して pthread を使用します。"ldd" を実行して確認してください。

于 2010-06-21T21:44:32.030 に答える