Mutex是可以进程间同步的同步基元。
名称 | 说明 | |
---|---|---|
Mutex() |
使用默认属性初始化 Mutex 类的新实例。 |
|
Mutex(Boolean) |
使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权)初始化 Mutex 类的新实例。 |
|
Mutex(Boolean, String) |
使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称)初始化 Mutex 类的新实例。 |
|
Mutex(Boolean, String, Boolean) |
使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权的 Boolean 值初始化 Mutex 类的新实例。 |
|
Mutex(Boolean, String, Boolean, MutexSecurity) |
使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权以及访问控制安全是否已应用到命名互斥体的 Boolean 变量初始化 Mutex 类的新实例。 |
1 private static Mutex _asyncLocker = new Mutex(); 2 static void Main(string[] args) 3 { 4 MutextDemo mutext = new MutextDemo(); 5 int test = 0; 6 Thread th1 = new Thread(() => 7 { 8 for (int i = 0; i < 100; i++) 9 Add(ref test); 10 }); 11 th1.Name = "T1"; 12 Thread th2 = new Thread(() => 13 { 14 for (int i = 0; i < 100; i++) 15 Add(ref test, 10); 16 }); 17 th2.Name = "T2"; 18 Thread th3 = new Thread(() => 19 { 20 for (int i = 0; i < 100; i++) 21 Add(ref test, 20); 22 }); 23 th3.Name = "T3"; 24 Thread th4 = new Thread(() => 25 { 26 for (int i = 0; i < 100; i++) 27 Add(ref test, 30); 28 }); 29 th4.Name = "T4"; 30 Thread th5 = new Thread(() => 31 { 32 for (int i = 0; i < 100; i++) 33 Add(ref test, 40); 34 }); 35 th5.Name = "T5"; 36 37 th1.Start(); 38 th2.Start(); 39 th3.Start(); 40 th4.Start(); 41 th5.Start(); 42 43 Console.ReadKey(); 44 } 45 46 public static void Add(ref int value, int sleep = 0) 47 { 48 _asyncLocker.WaitOne(); 49 int temp = value; 50 Thread.Sleep(sleep); 51 value = temp + 1; 52 Console.WriteLine($"{Thread.CurrentThread.Name} : {value}"); 53 _asyncLocker.ReleaseMutex(); 54 }
使用时,WaitOne函数与ReleaseMutex函数必须配对使用。
System.Object
System.MarshalByRefObject
System.Threading.WaitHandle
System.Threading.Mutex
System.MarshalByRefObject
System.Threading.WaitHandle
System.Threading.Mutex
MarshalByRefObject 类 允许在支持远程处理的应用程序中跨应用程序域边界访问对象。
互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步。互斥量是调用的Win32的API对互斥锁的操作,因此在同一操作系统下不同进程可以按照互斥锁的名称共享锁。
正因为如此,互斥锁的操作会调用系统资源,性能上相对于临界区也有降低。对于进程内的线程同步使用临界区性能会更佳。
参考链接: