2011-01-07 16 views
9

私がアトミックを言ったとき、私は命令のセットが同じプロセスの別のスレッドにのコンテキスト切り替えなしで実行されることを意味しました(もちろん、他の種類のスイッチも行われなければなりません)。私が思いついた唯一の解決策は、現在実行されている部分を除くすべてのスレッドを一時停止し、その後に再開することです。それ以上のエレガントな方法?コードをアトミ​​ック(C#)にすることは可能ですか?

私がしたいのは、複数のスレッドで実行されているオブジェクトの一貫した状態を収集するためです。しかし、それらのコードは変更できません(すでにコンパイルされています)ので、mutex、セマフォなどを挿入することはできません。原子操作は、もちろん、状態収集(すなわち、いくつかの変数のコピー)である。

+1

達成しようとしていることは何ですか?他のすべてのスレッドを中断することは危険な方法です。あなたが目を覚ましたスレッドが何かをしようとするとデッドロックが発生し、中断されたスレッドの1つが何らかの種類のロックを解除してしまうことがあります。 –

+0

私はこの文脈で原子という言葉を聞いたことがありません。私はそれをACIDの一部として、トランザクションの定義としてしか知りません。ところで、なぜこれが必要ですか? –

+0

個々のIL演算はアトミックです。アトミック操作をサポートするクラスは非常に少なく(インターロックされています)。それ以外は、そして私はその点を見ません。 – Amy

答えて

4

Interlockedクラスのいくつかのアトミック操作がありますが、それは唯一のいくつかの非常に簡単な操作を提供します。これは、コードのアトミックブロック全体を作成するために使用することはできません。

ロックを慎重に使用して、コンテキストが変更されてもコードが機能することを確認することをおすすめします。

1

まあ、locksを使用できますが、コンテキストの切り替えを正確に防ぐことはできません。しかし、あなたのスレッドが同じオブジェクトにロックしていると、明らかに待っているスレッドは実行されないので、何も実行されないのでコンテキストの切り替えは必要ありません。

this pageもご覧ください。

+0

ロックは必ずしも「同じプロセス上の別のスレッドにコンテキストを切り替えることはありません」 –

+0

ええ、私はそれを後で理解しました。少し変更を加えましたが、私はそれがまだ質問にうまく答えていないと思います。 – Mehrdad

-1

いいえコードブロックをモニタで囲んでスレッドセーフにすることはできますが、一般的なコードスニペットをアトミックにすることはできません。

object lck = new object(); 

lock(lck) 
{ 
    // thread safe code goes in here 

} 
+0

なぜこれがダウン表示されていますか?私の答えは何とか間違っていますか? – Amy

+0

@ yodaj007:それは私がdownvotedだとは思えませんでしたが、私は推測しています:あなたのコード(盲目的にコピーしてペーストした場合)が実行されるたびに新しいオブジェクトを作成するので、 –

+0

はい、これは入力したとおりです。それは盲目的にコピー/ペーストされていませんでした。私はNotepad ++でそれをタイプアップしました。 – Amy

0

いいえ、それはマルチタスキングです。

あなたの質問の対象ではないインクリメントのような非常に簡単な操作をしない限り。

+1

Interlockedクラスについて話している場合を除き、数値の増分はアトミックではありません。必要に応じて、デモンストレーションするためのコードを提供することができます。それで質問をして、私はそれに答えます。 – Amy

+0

私は一般的に言いました、そして、その単純な操作は 'Interlocked.Increament()'のようなものです。 – Xaqron

0

原子1個のリーダ/マルチライタレジスタの集合(アレイ)で構成される共有メモリからグローバル状態を得ることができます。解決策は簡単ですが、簡単なものではありません。あなたは論文 "共有メモリのスナップショット"に掲載されたアルゴリズムを読むことができます。または、マルチコアプログラミングの書籍の草書から第4章を読むことができます。ここでは、Java言語の実装についてアイデアを得ることができます。そのアイデアに慣れて、それを他の言語に移すことができるはずです。申し訳ありませんが、私の英語が十分でない場合。

関連する問題