C#マルチスレッドプログラミング:Monitorの使用例とMutexの概要

4516 ワード

Monitorクラスの効果はlockと似ています.

  
    
1 System.Object obj = (System.Object)x;
2 System.Threading.Monitor.Enter(obj);
3 try
4 {
5    DoSomething();
6 }
7 finally
8 {
9    System.Threading.Monitor.Exit(obj);
10 }
lockキーワードはMonitorより簡潔で、実はlockはMonitorのEnterとExitのパッケージです.
また、Monitorにはいくつかの一般的な方法があります.
  (1) TryEnter
TryEnterは長期死などの問題を効果的に断つことができ、同時に頻繁に発生し、持続時間の長い環境でTryEnterを使用すれば、デッドロックや長時間の待機を効果的に防止することができる.
たとえば、待機時間を設定できます.
  bool gotLock = Monitor.TryEnter(myobject,1000)
現在のスレッドを1000秒待機した後、返されるbool値に基づいて次の操作を続行するかどうかを決定します.
  (2) Pulse、PulseAll、Wait
PulseとPulseAllにはWaitメソッドがペアで使用されており、スレッド間の同時制御をより正確に行うことができます.
サンプルコード:

  
    
1 using System.Threading;
2
3 public class Program
4 {
5 //
6 static object ball = new object();
7
8 public static void Main()
9 {
10 //
11 Thread threadPing = new Thread(ThreadPingProc);
12 Thread threadPong = new Thread(ThreadPongProc);
13
14 threadPing.Start();
15 threadPong.Start();
16
17 System.Console.ReadLine();
18 }
19
20 static void ThreadPingProc()
21 {
22 System.Console.WriteLine("Thread Ping Start!");
23
24 // ball
25 lock (ball)
26 {
27 for (int i = 0; i < 5; i++)
28 {
29 System.Console.WriteLine("ThreadPing: Ping ");
30 // ball
31 Monitor.Pulse(ball);
32 // ball , , ball
33 Monitor.Wait(ball);
34 }
35
36 // ball
37 Monitor.Pulse(ball);
38 }
39
40 System.Console.WriteLine("ThreadPing: Bye!");
41 }
42
43 static void ThreadPongProc()
44 {
45 System.Console.WriteLine("Thread Pong Start!");
46
47 // ball
48 lock (ball)
49 {
50 for (int i = 0; i < 5; i++)
51 {
52 System.Console.WriteLine("ThreadPong: Pong ");
53 // ball
54 Monitor.Pulse(ball);
55 // ball , , ball
56 Monitor.Wait(ball);
57 }
58
59 // ball
60 Monitor.Pulse(ball);
61 }
62
63 System.Console.WriteLine("ThreadPong: Bye!");
64 }
65 }
実行結果は次のとおりです.
  ThreadPing: Hello!
  ThreadPing: Ping   ThreadPong: Hello!   ThreadPong: Pong   ThreadPing: Ping   ThreadPong: Pong   ThreadPing: Ping   ThreadPong: Pong   ThreadPing: Ping   ThreadPong: Pong   ThreadPing: Ping   ThreadPong: Pong   ThreadPing: Bye!
  ThreadPong: Bye!threadPingプロセスがThreadPingProcに入ってballをロックし、Monitorを呼び出す.Pulse(ball)の後、threadPongにブロックキューから準備キューに入るように通知します.threadPingがMonitorを呼び出すとWait(ball)は自分をブロックした後、ballのロックを放棄したのでthreadPongが実行された.PulseAllはPulseメソッドと似ていますが、ブロックキュー内のすべてのプロセスに通知信号を送信します.スレッドが1つしかブロックされていない場合は、Pulseメソッドを使用します.
MutexオブジェクトMutexはMonitorと似ていますが、ここでは邪魔になりません.注意が必要なのは、Mutexは2つに分かれています.1つはローカルMutexで、1つはシステムレベルのMutexです.システムレベルのMutexは、プロセス間のスレッド間の同期に使用できます.Mutexはプロセス内のスレッド同期に使用することができるが、Monitorを使用することは、Monitorが特別であるため、通常より望ましい.NET Frameworkで設計されているので、リソースをよりよく利用できます.それに対して、MutexクラスはWin 32構造のパッケージです.MutexはMonitorよりも強力ですが、Monitorクラスに比べて、相互運用変換に必要なコンピューティングリソースを消費します.