zoukankan      html  css  js  c++  java
  • C# Mutex对象学习经验

     

     

    这里介绍使用了C# Mutex对象来同步四个线程,主线程等待四个线程的结束,而这四个线程的运行又是与两个C# Mutex对象相关联的。

    如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类。

    我们可以把Mutex看作一个出租车,乘客看作线程。乘客首先等车,然后上车,最后下车。当一个乘客在车上时,其他乘客就只有等他下车以后才可以上车。而线程与C# Mutex对象的关系也正是如此,线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。

    下面这个例子使用了C# Mutex对象来同步四个线程,主线程等待四个线程的结束,而这四个线程的运行又是与两个C# Mutex对象相关联的。

    其中还用到AutoResetEvent类的对象,可以把它理解为一个信号灯。这里用它的有信号状态来表示一个线程的结束。

    1.            using System;  

    2.            using System.Threading;  

    3.             

    4.            namespace ThreadExample  

    5.            {  

    6.            public class MutexSample  

    7.            {  

    8.            static Mutex gM1;  

    9.            static Mutex gM2;  

    10.        const int ITERS = 100;  

    11.        static AutoResetEvent Event1 = new AutoResetEvent(false);  

    12.        static AutoResetEvent Event2 = new AutoResetEvent(false);  

    13.        static AutoResetEvent Event3 = new AutoResetEvent(false);  

    14.        static AutoResetEvent Event4 = new AutoResetEvent(false);  

    15.         

    16.        public static void Main(String[] args)  

    17.        {  

    18.        Console.WriteLine("Mutex Sample ");  

    19.        //创建一个Mutex对象,并且命名为MyMutex  

    20.        gM1 = new Mutex(true,"MyMutex");  

    21.        //创建一个未命名的Mutex 对象.  

    22.        gM2 = new Mutex(true);  

    23.        Console.WriteLine(" - Main Owns gM1 and gM2");  

    24.         

    25.        AutoResetEvent[] evs = new AutoResetEvent[4];  

    26.        evs[0] = Event1; //为后面的线程t1,t2,t3,t4定义AutoResetEvent对象 

    27.        evs[1] = Event2;   

    28.        evs[2] = Event3;   

    29.        evs[3] = Event4;   

    30.         

    31.        MutexSample tm = new MutexSample( );  

    32.        Thread t1 = new Thread(new ThreadStart(tm.t1Start));  

    33.        Thread t2 = new Thread(new ThreadStart(tm.t2Start));  

    34.        Thread t3 = new Thread(new ThreadStart(tm.t3Start));  

    35.        Thread t4 = new Thread(new ThreadStart(tm.t4Start));  

    36.        t1.Start( );// 使用Mutex.WaitAll()方法等待一个Mutex数组中的对象全部被释放 

    37.        t2.Start( );// 使用Mutex.WaitOne()方法等待gM1的释放 

    38.        t3.Start( );// 使用Mutex.WaitAny()方法等待一个Mutex数组中任意一个对象被释放 

    39.        t4.Start( );// 使用Mutex.WaitOne()方法等待gM2的释放 

    40.         

    41.        Thread.Sleep(2000);  

    42.        Console.WriteLine(" - Main releases gM1");  

    43.        gM1.ReleaseMutex( ); //线程t2,t3结束条件满足 

    44.         

    45.        Thread.Sleep(1000);  

    46.        Console.WriteLine(" - Main releases gM2");  

    47.        gM2.ReleaseMutex( ); //线程t1,t4结束条件满足 

    48.         

    49.        //等待所有四个线程结束 

    50.        WaitHandle.WaitAll(evs);   

    51.        Console.WriteLine(" Mutex Sample");  

    52.        Console.ReadLine();  

    53.        }  

    54.         

    55.        public void t1Start( )  

    56.        {  

    57.        Console.WriteLine("t1Start started, Mutex.WaitAll(Mutex[])");  

    58.        Mutex[] gMs = new Mutex[2];  

    59.        gMs[0] = gM1;//创建一个Mutex数组作为Mutex.WaitAll()方法的参数 

    60.        gMs[1] = gM2;  

    61.        Mutex.WaitAll(gMs);//等待gM1gM2都被释放 

    62.        Thread.Sleep(2000);  

    63.        Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[]) satisfied");  

    64.        Event1.Set( ); //线程结束,将Event1设置为有信号状态 

    65.        }  

    66.        public void t2Start( )  

    67.        {  

    68.        Console.WriteLine("t2Start started, gM1.WaitOne( )");  

    69.        gM1.WaitOne( );//等待gM1的释放 

    70.        Console.WriteLine("t2Start finished, gM1.WaitOne( ) satisfied");  

    71.        Event2.Set( );//线程结束,将Event2设置为有信号状态 

    72.        }  

    73.        public void t3Start( )  

    74.        {  

    75.        Console.WriteLine("t3Start started, Mutex.WaitAny(Mutex[])");  

    76.        Mutex[] gMs = new Mutex[2];  

    77.        gMs[0] = gM1;//创建一个Mutex数组作为Mutex.WaitAny()方法的参数 

    78.        gMs[1] = gM2;  

    79.        Mutex.WaitAny(gMs);//等待数组中任意一个Mutex对象被释放 

    80.        Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])");  

    81.        Event3.Set( );//线程结束,将Event3设置为有信号状态 

    82.        }  

    83.        public void t4Start( )  

    84.        {  

    85.        Console.WriteLine("t4Start started, gM2.WaitOne( )");  

    86.        gM2.WaitOne( );//等待gM2被释放 

    87.        Console.WriteLine("t4Start finished, gM2.WaitOne( )");  

    88.        Event4.Set( );//线程结束,将Event4设置为有信号状态 

    89.        }  

    90.        }  

    91.       

  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/kakaliush/p/1945298.html
Copyright © 2011-2022 走看看