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

     看效果……

     

     轮换执行……

  • 相关阅读:
    公输盘
    电脑机器刷BIOS
    八皇后问题的实现
    安装msdn出现的问题及解决
    加密推荐书籍
    C++待解
    atan()与atan2()
    Win32/MFC/COM学习推荐书籍
    C++问题
    windows2000 sp4下载
  • 原文地址:https://www.cnblogs.com/zhanghaichang/p/1967298.html
Copyright © 2011-2022 走看看