2013-03-25 8 views
9

スレッディングの仕組みを頭に入れようとしています。スレッドの周りを頭で包みようとしています

オリジナル理解:私は、スレッドが単一のクラスとそのサブクラスに限られていたと思っ前

、何のクラスは、スレッド間で共有することはできない、とスレッド間の通信は、それが本当のハード私が理解するために作られました。

新しい理解:

しかし、スレッドがちょうど同じコード内のランダムな時点で実行されているように多くの私はそれについて読んで、それは代わりに思えます。特定の領域に制限することはできますが、理論的には同じコードがスレッドごとに複数回実行される可能性があります。

別の言い方をすれば、コードがターンと接続を持つ道路システムであると見なすと、プログラムが実行できるフローであり、メインスレッドはこれを実行します。新しいスレッドが生成された場合は、どこから始めるべきか、そこからコードが移動し、同じクラスとコマンドを使用できるので、コードが「悪い」場合は、2つのコード "コードとの読み書き、同じプログラムのすべての部分、「道路」上の複数の「車」だけに制限はありません。

特定の領域(ループ/コードの一部)にとどまり、特定の場所でのみ対話するスレッドを制限することもできますが、無視して「クラッシュ」を避けることもできます。


「新しい理解」スレッドを使用すると、私の頭を包み込むのがずっと簡単になるので、正しいことは分かりますか?

+7

はい、後ほどの理解は多かれ少なかれ正しいです!あなたの類推を拡張するために、スレッド同期関数とオブジェクト(例えば、 'ManualResetEvent'と' lock')は、車が衝突するのを防ぐ信号灯のようなものです。 :) –

+7

ここにスレッドに関する優れた無料の電子ブックがあります:['Albahari'](http://www.albahari.com/threading/) –

+0

お互いからの入力をありがとう。突然、私の頭の中で働き、周りを包み込むことがはっきりと分かります。非常に単純です...だから間違っているともっと危険です:) – Taoh

答えて

1

あなたはかなりヒットしました。一般的に、スレッドは特殊な作業を行うためにあり、互いに重複しません。メインスレッドがの作業を実行するサブスレッドを生成する必要がある場合、メインスレッドはほとんど常にこの作業を行わないでしょう作業

オーバーラップする領域は、お互いのつま先を踏み外さないように「スレッドセーフ」にする必要があります。たとえば、複数のワーカースレッドがメインスレッドのコレクションを埋めます。 MSDNでクラスを検索するときは、スレッドの安全性が組み込まれているかどうか、または.netのロック、mutexes、またはセマフォの使用によって自分自身で行う必要があるかどうかを示す下部の宣言に気付くでしょう。

+0

おかげで、以前は間違った方法でスレッドを見ていた。プログラムの残りの部分から分離された領域として、それらを「複数のドライバ」と見なす代わりに、衝突を回避する方法は、それらを分離することですが、必要ではありません。 – Taoh

関連する問題