※ ChatGPTを利用し、要約された質問です(原文:[C#/.NET2.0] 状況によりスレッドを実行しないで終える方法)
[C#/.NET2.0] 同時に複数のスレッドを終了させる方法
このQ&Aのポイント
初心者のため、C#と.NETでのマルチスレッド制御について悩んでいます。
あるスレッドが実行中の場合、他のスレッドが待機せずに終了する排他的な処理を作りたいです。
現在はロックオブジェクトを使用して実装していますが、他の書き方や作法があるかどうか知りたいです。
[C#/.NET2.0] 状況によりスレッドを実行しないで終える方法
[C#/.NET2.0] 状況によりスレッドを実行しないで終える方法
こんにちは、お世話になってます。C#と.NETでプログラムを組み始めて2週間程度の初心者です。C/C++カテ違いっぽくてごめんなさい。
マルチスレッドの制御で悩んでいます。ファンクション(func)が、複数のスレッド(a,b,c,…)で起動されます。スレッドは、デバイス入力を処理し起動されるため、順不同で非同期(というのかな?)です。この時、あるスレッドによりfuncが処理中であれば、他のスレッドは待機しないで終了する。というような排他的処理を作りたいと考えています。たとえば、bが起動されているときは、aやcのスレッドが起動されても、待機せずに終了するような感じです。
試しに下記のような仕組みを考えてみました。
01:object key_syncer = new object();
02:volatile bool key_locked = false;
03:
04:void func() {
05: //===== Gate =====
06: lock(key_syncer) {
07: if(key_locked) return;
08: key_locked = true;
09: }
10:
11: //===== Function Body =====
12: /* Some behavior */
13:
14: //===== Exit =====
15: lock(key_syncer) {
16: key_locked = false;
17: }
18:}
とりあえずは動いているのですが、マルチスレッドの作法に未熟で自信が無いです。スレッドセーフを意識したり、「普通こう書くだろ?」というような作法もわかっていません(汗)。上記の様な書き方の良否や、異なる書き方などありましたら、アドバイスいただけるとうれしいです。よろしくお願いいたします。
お礼
kentarou2333さん、回答ありがとうございます。 MSDNのMoitorクラスを眺めましたら、TryEnter()を見つけました。おっしゃるとおり、普通これだろ?っていう機能ですね。書き換えてみました。 01:void func() { 02: //===== Exclusive lock without blocking ===== 03: //(*) Exit if another thread is running. 04: if( !Monitor.TryEnter(this) ) { 05: return; 06: } 07: 08: //===== Function Body ===== 09: /* Some behavior */ 10:} Monitorメソッド一覧を何度もみてたのに、こんな気がつきそうな名前を見落としてました・・・排他制御というと、ブロックするという固定観念があり、目にうろこでした。ともあれ、勉強になりました。ありがとうございます! ダメダシ等あるとうれしいので、もう数日待って、クローズさせていただきます。