3

開発の仕事を探していますが、多くのリストで、開発者はマルチスレッドに精通している必要があると指定されています。これは、Java の求人情報と、UNIX での「システム プログラミング」を含む C++ の求人情報の両方に表示されます。

ここ数年、私は Java に取り組んでおり、Java のさまざまな同期メカニズムを使用しています。

90 年代後半、スレッドはほとんどありませんでしたが、多くの C++ 作業を行いました。しかし大学では、Solaris でスレッドを使用していました。

私の質問は、C/C++ の開発者が Java の開発者と比較して直面する問題に大きな違いがあるかどうか、およびそれらに対処するための手法のいずれかが根本的に異なるかどうかです。Java には明らかに、いくつかの優れたメカニズムや同期バージョンのコレクションなどが含まれています。

UNIX でスレッド化を更新または再学習したい場合、最善の方法は何ですか? どのライブラリを見ればよいですか?など。C ++のスレッドに関する現在の優れたチュートリアルはありますか?

4

6 に答える 6

7

スレッド化の基本的な課題 (同期、競合状態、スレッド間通信、リソースのクリーンアップなど) ですが、Java では、ガベージ コレクション、例外、高度な同期オブジェクト、リフレクションによる高度なデバッグ サポートにより、スレッドをより管理しやすくしています。

C++ では、メモリの破損や「不可能な」競合状態が発生する可能性がはるかに高くなります。また、標準化された言語の一部ではない、より多くの低レベルのスレッド プリミティブを記述するか、ライブラリ (boost など) に依存する必要があります。

于 2009-03-13T05:14:49.380 に答える
4

C++ は、Java にはない機能 ( RAIIまたは「リソースの取得は初期化」) を備えているため、複雑なスレッド化されたコードを Java よりも実際に簡単に記述できます。このイディオムは、適切に記述された C++ コードのすべてのリソース制御に使用されますが、同期の自動管理が必須であるマルチスレッド コードでは特に適切です。

于 2009-03-13T09:07:02.440 に答える
3

ガベージ コレクションを使用すると、メモリ リークのないスレッドのプログラミングが容易になります。また、コレクションのタイミングに対処するためにできる優れた方法もあります。

決定論的デストラクタは、ゾンビを生成しないプログラミング スレッドを容易にします。ACM ペーパーはこちらを参照してください。

于 2009-03-13T04:55:49.613 に答える
3

pthreadsboostを見てください(pthreads はランダムなリンクでしたが、出発点としては問題ないようです)。

高レベルでは、Java/C/C++/ の問題は同じです。問題を解決する方法 (呼び出す関数、作成するクラスなど) の詳細は、言語によって異なります。

于 2009-03-13T05:01:23.047 に答える
1

どのレベルで働くかによって異なります。Intel TBB と OpenMP は、非常に高いレベルから多くの一般的なケースを処理します。Posix スレッド、Windows API、Boost スレッドなどのポータブル ライブラリにより、Java のプリミティブと同じレベルに近づけることができます。

C++0x スレッド化 (特に、メモリ バリアの取得と解放を使用) を使用すると、Java が提供するものよりもさらに制御と複雑性を高めるために、さらに低いレベルに進むことができます (Java で変数volatileをマークすると、メモリ バリアの取得と解放の両方が提供されますが、 Java では、取得または解放バリアのみを要求することはできません (C++0x では可能です)。

C++0x のスレッド モデルは、人々がその上に TBB のようなものを構築することを期待して、意図的に低レベルであることに注意してください。次回標準委員会が会合したときに、それらのより高いレベルのライブラリと、ツールキットは、学習するのに十分に機能します。

于 2009-03-13T08:48:12.580 に答える
0

使用されているプログラミング言語に関係なく、スレッドの特異性は一般的です。たとえば、OS 間でさえ、POSIX スレッドと WIN32 スレッドは同じ一連の論理的特異性を持っていますが、API 呼び出しとネイティブ実装 WRT の基礎となるハードウェア/カーネルは変更される可能性がありますが、システム プログラマーにとっては、スレッドに関する論理的思考とそれらを期待どおりに機能させる方法&これを達成するのが最も難しい部分です。これは、プログラミング言語に関しても当てはまります。スレッド化とスレッド同期の概念を本当に理解している場合は、好きなプログラミング言語でそれらを使用してください。これらのプログラミング言語は、ネイティブ スレッド/スレッド同期の実装の上に構文糖衣を提供するためです。

于 2009-03-13T07:29:28.277 に答える