zoukankan      html  css  js  c++  java
  • C#多线程 Mutex

    C#多线程 - Mutex

    DotNet 2010-05-29 19:07:24 阅读151 评论0   字号: 订阅

    互斥锁(Mutex)

    互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它。

    互斥锁可适用于一个共享资源每次只能被一个线程访问的情况

     函数:

    //创建一个处于未获取状态的互斥锁

    Public Mutex();

    //如果ownedtrue,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态

     Public Mutex(bool owned);

     如果要获取一个互斥锁。应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle

    它处于等到状态直至所调用互斥锁可以被获取,因此该方法将组织住主调线程直到指定的互斥锁可用,如果不需要拥有互斥锁,用ReleaseMutex方法释放,从而使互斥锁可以被另外一个线程所获取。


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using System.Threading;

    namespace MyTTCon
    {
        
    class shareRes
        {
            
    public static int count = 0;
            
    public static Mutex mutex = new Mutex();
        }

        
    class IncThread
        {
            
    int number;
            
    public Thread thrd;
            
    public IncThread(string name, int n)
            {
                thrd 
    = new Thread(this.run);
                number 
    = n;
                thrd.Name 
    = name;
                thrd.Start();
            }
            
    void run()
            {
                Console.WriteLine(thrd.Name 
    + "正在等待 the mutex");
                
    //申请
                shareRes.mutex.WaitOne();
                Console.WriteLine(thrd.Name 
    + "申请到 the mutex");
                
    do
                {
                    Thread.Sleep(
    1000);
                    shareRes.count
    ++;
                    Console.WriteLine(
    "In " + thrd.Name + "ShareRes.count is " + shareRes.count);
                    number
    --;
                } 
    while (number > 0);
                Console.WriteLine(thrd.Name 
    + "释放 the nmutex");
                
    //  释放
                shareRes.mutex.ReleaseMutex();
            }
        }
        
    class DecThread
        {
            
    int number;
            
    public Thread thrd;
            
    public DecThread(string name, int n)
            {
                thrd 
    = new Thread(this.run);
                number 
    = n;
                thrd.Name 
    = name;
                thrd.Start();
            }
            
    void run()
            {
                Console.WriteLine(thrd.Name 
    + "正在等待 the mutex");
                
    //申请
                shareRes.mutex.WaitOne();
                Console.WriteLine(thrd.Name 
    + "申请到 the mutex");
                
    do
                {
                    Thread.Sleep(
    1000);
                    shareRes.count
    --;
                    Console.WriteLine(
    "In " + thrd.Name + "ShareRes.count is " + shareRes.count);
                    number
    --;
                } 
    while (number > 0);
                Console.WriteLine(thrd.Name 
    + "释放 the nmutex");
                
    //  释放
                shareRes.mutex.ReleaseMutex();
            }
        }

        
    class Program
        {
            
    static void Main(string[] args)
            {
                IncThread mthrd1 
    = new IncThread("IncThread thread "5);
                DecThread mthrd2 
    = new DecThread("DecThread thread "5);
                mthrd1.thrd.Join();
                mthrd2.thrd.Join();
            }
        }
    }

    System.Threading.Mutex在概念上和System.Threading.Monitor几乎完全一致,只是lock关键字用的不是它,而且它旨在进程间的同步。

    Code

     运行以上代码生成的应用程序第一个实例,会得到结果

    Running

     保持第一个运行状态,运行第二个实例,得到结果

    Another is Running

     以上代码中创建了一个mutex,从其参数的解释中得知,第一个调用线程将得到互斥体的初始所属权,如果不释放的话,其他的线程得不到互斥体所有权

     下面看一段代码(出自 http://space.itpub.net/12639172/viewspace-448867 ),稍有改动

    Code

     两个线程基本上是按照各自的时间间隔+TestFunc的执行时间对TestFunc函数进行读取

     将公共调用的函数加锁

    Code

     再次运行查看结果,好像没什么区别?

     加入mutex

    Code

     再次运行查看结果。

     

    想到了什么?thread1Func() 或者thread2Func()中的全部执行完毕,之后释放互斥体,然后剩下的那个才可以访问。

     再改动一次

    Code

     看效果……

     

     轮换执行……

  • 相关阅读:
    flex + bison multiple parsers
    Educational Codeforces Round 95 (Rated for Div. 2)
    python学习笔记 day20 序列化模块(二)
    python学习笔记 day20 常用模块(六)
    python 学习笔记 常用模块(五)
    python学习笔记 day19 常用模块(四)
    python学习笔记 day19 常用模块(三)
    python学习笔记 day19 常用模块(二)
    python学习笔记 day19 作业讲解-使用正则表达式实现计算器
    python学习笔记 day19 常用模块
  • 原文地址:https://www.cnblogs.com/zhanghaichang/p/1967298.html
Copyright © 2011-2022 走看看