zoukankan      html  css  js  c++  java
  • c# 多线程 --Mutex(互斥锁)

    互斥锁(Mutex)

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

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

     函数:

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

    Public Mutex();

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

     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();
            }
        }
    }

     原文链接:http://www.cnblogs.com/tianzhiliang/archive/2010/09/01/1814822.html

  • 相关阅读:
    WIn7 磁盘分区工具试用记录
    DirectShow 开发环境搭建(整理)
    WinCE 在连续创建约 1000 个文件后,再创建文件失败。这是为什么???
    在命令行处理 console 应用执行的返回值
    WinCE 的发展史及相关基础知识
    DirectShow Filter 基础与简单的示例程序
    使用 VS2005 编译 directshow sample 时链接错误
    车载系统之 Windows CE 应用软件框架设计
    兰州烧饼
    对决
  • 原文地址:https://www.cnblogs.com/nele/p/5534580.html
Copyright © 2011-2022 走看看