2


0

オブジェクト指向言語でプログラムするときにスレッドを作成するために使用できるテンプレートはありますか?

オブジェクト指向言語用のスレッド化パッケージの設計についてはどうすればいいですか?

7 Answer


3


サポート

C 0xは 標準ライブラリのスレッドをサポートします。

現在のところ、各プラットフォームは独自の方法でスレッドを実装しています( Windows、http://www.yolinux.com)。 /TUTORIALS/LinuxTutorialPosixThreads.html [POSIX])ただし、 boost::threadのようなものを使用することができますプラットフォーム固有のことを心配する。

Javaには Threadクラスがあります。

方法

一般に、クラスを別のスレッドに入れるには、そのクラスをスレッドに渡しながらスレッドを作成します。 その後、スレッドはそのクラスの関数を呼び出します。 これが疑似Cコードです。

main(){Object myObject;

thread = CreateThread(threadFunction、myObject);

thread.join(); //スレッドを待つ}

threadFunction(Object theObject){theObject.doSomething(); }

これはすべて、Cでboost(またはC 0xスレッド)を使用することによって単純化され、JavaのThreadクラスがこれを処理します。

関連情報

スレッド化アプリケーションにおける大きな問題は、スレッドの同期です。 これには、カップルを挙げると、 race conditionsdeadlocksなどの問題が含まれます。

http://en.wikipedia.org/wiki/Mutual_exclusion[mutex]など、これらの問題を解決するためのメソッド/オブジェクトが存在します。 ミューテックスは1つのスレッドでロックできます。ミューテックスをロックしようとする他のスレッドは、元のスレッドがミューテックスを解放するまでブロックされます。
http://en.wikipedia.org/wiki/Semaphore_(programming)[semaphore]は一般化されたミューテックスです。

Ericの投稿で概説されているように他の有用な概念があります。


2


各フレームワークには、スレッドを扱うための独自の方法があります。 私はあなたがあなたがJavaドキュメンテーションの中でJavaスレッドクラスを調べ、そしておそらくスレッドの詳細についてはC標準ヘッダを調べることを勧めます。


1


各プログラミング言語には、スレッドを処理する特定の方法があります。

http://www.boost.org/doc/libs/1_38_0/doc/html/thread.html[CはBoostに大きく依存しています]ので、それを確認したい場合があります。
http://java.sun.com/docs/books/tutorial/essential/concurrency/[Java]

基本的に、並行処理について学んだことはすべて、使用しているOSや言語に関係なく適用できます。 避けるためにあなたが学ばなければならない大体4つの問題があります

  • デッドロック

  • ライブロック

  • レースコンディション

  • 飢え

これは直接あなたの質問とは関係ありませんが、これらはあなたが与えられた言語で特定の構文を学ぶことと並行して学ぶべき課題です。 Cは少しトリッキーかもしれませんが、Javaはもちろん非常に簡単です、あなたの選択

次のようなスレッドを同期するための「よく知られた方法」もいくつかあります。

  • イベント

  • ロック

  • モニター

  • ミューテックス

  • セマフォ

  • バリア

  • …​

このリストは延々と続くが、基本的にあなたが言及された4つの問題を解決するのを助けるであろう「オブジェクト」または変数を助けて


1


C / Cでは、スレッドはしばしば関数を使って実装されます。 (「新しいスレッドを開始してこの関数を内部で実行すると、関数の終了時にスレッドが破棄されます。」

スレッドフレームワークはしばしば関数にパラメータを渡すことを可能にします。 スレッドでオブジェクト指向を行う1つの方法は、オブジェクトポインタ( "this")を関数のパラメータとして渡してから、そのオブジェクトの特定のメソッドを呼び出すことです。


0


MFCを使用している場合、MFCはマルチスレッドで動作するためのフレームワークヘルパーAPIをいくつか提供します。 この記事をご覧ください。 CおよびMFCによるマルチスレッド


0


Javaでは、ThreadクラスまたはExecutorインタフェースを使用できます。これらのインタフェースには、実行可能オブジェクトを送信できます。 java.util.concurrentパッケージを調べてください。 そして、Javaチュートリアルの concurrency trailです。


0


OOPとマルチスレッドプログラミングとの主な違いは、新しいスレッドにその起動関数としてオブジェクトの(非静的)メソッドを持たせることです。

これには、いくつかのプログラミングモデルがあります。「Runnable」インターフェイスの実装は、最も一般的に使用されているものです。 あなたのクラスは、通常 "run"と呼ばれる仮想メソッドである起動メソッドを持つ標準の "Runnable"インターフェースを実装しています。 起動コードをその仮想メソッドに入れて、スレッドを生成する必要があるときにスレッドオブジェクト(通常はThreadと呼ばれる)を作成し、それに「Runnable」インターフェースを実装するクラスのオブジェクトを渡します。 それから、その "Thread"オブジェクトの "start"メソッドを呼び出します。それはあなたがあなたのクラスで書いた起動コードが新しいスレッドを実行するように気をつけます。 この例では、 "Runnable"と "Thread"の両方が、選択したスレッドライブラリ、または選択したプログラミング言語の標準ライブラリ/フレームワークによって提供されています。 また、これら2つのクラスの名前は異なる場合があります。

マルチスレッドプログラミングに関して言えば、CとJavaの間には大きな違いがあります。それをサポートしているJavaとは対照的に、Cはマルチスレッドをサポートしていません。

そのため、Cでは、Pthreads(http://en.wikipedia.org/wiki/POSIX_Threads)などの特殊なスレッドライブラリ、またはBoost、ACE、POCOなど、すでにスレッドをサポートしている汎用ライブラリを使用する必要があります。 お勧めしない方法は、OSのマルチスレッド関連サービスを直接呼び出すことです。

Javaの場合、どのエディションを使用していても、マルチスレッドプログラミングの組み込みはすでにサポートされています。