zoukankan      html  css  js  c++  java
  • [.net 多线程]Mutex

    Mutex是可以进程间同步的同步基元。

     名称说明
    System_CAPS_pubmethod Mutex()

    使用默认属性初始化 Mutex 类的新实例。

    System_CAPS_pubmethod Mutex(Boolean)

    使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权)初始化 Mutex 类的新实例。

    System_CAPS_pubmethod Mutex(Boolean, String)

    使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称)初始化 Mutex 类的新实例。

    System_CAPS_pubmethod Mutex(Boolean, String, Boolean)

    使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权的 Boolean 值初始化 Mutex 类的新实例。

    System_CAPS_pubmethod 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 }
    Mutex示例代码

    使用时,WaitOne函数与ReleaseMutex函数必须配对使用。

    System.Object
      System.MarshalByRefObject
        System.Threading.WaitHandle
          System.Threading.Mutex
    MarshalByRefObject 类 允许在支持远程处理的应用程序中跨应用程序域边界访问对象。
     

    互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步。互斥量是调用的Win32的API对互斥锁的操作,因此在同一操作系统下不同进程可以按照互斥锁的名称共享锁。

    正因为如此,互斥锁的操作会调用系统资源,性能上相对于临界区也有降低。对于进程内的线程同步使用临界区性能会更佳

    参考链接:

    http://www.myexception.cn/asp-dotnet/2112687.html

  • 相关阅读:
    [ZJOI2014]力
    [八省联考2018]劈配
    [APIO2007]动物园
    [九省联考2018]IIIDX
    [HAOI2015]树上染色
    [SHOI2008]堵塞的交通
    暑假第五周
    暑假第四周
    暑假第三周
    暑假第二周
  • 原文地址:https://www.cnblogs.com/deepminer/p/8998664.html
Copyright © 2011-2022 走看看