zoukankan      html  css  js  c++  java
  • 《C#多线程编程实战》2.3 Mutex

    这个真的是大坑。

    如果深入研究,像是同步域,上下文这类都会出现。

    但是书上有没有讲。

    完全不知道什么意思。

    勉勉强强讲这个Mutex的用法搞明白了。

    这个是原书代码:

    class Program
        {
            static void Main(string[] args)
            {
                const string MutexName = "CSharpThreadingCookbook";
    
                using (var m = new Mutex(false, MutexName))
                {
                    if (!m.WaitOne(TimeSpan.FromSeconds(5), false))
                    {
                        WriteLine("Second instance is running!");
                    }
                    else
                    {
                        WriteLine("Running!");
                        ReadLine();
                        m.ReleaseMutex();
                    }
                }
            }
        }

    同时运行两个程序时,会建立一个互斥锁。第一个程序拥有所有权。第二个等待5秒,如果未能拥有程序的所有权,则显示Second instance is running,如果等待5s之后拥有所有权就显示running

    所谓互斥锁,通俗点说:

    某人去ATM取钱时,在这个人则是拥有ATM的所有权,别人是无法使用这个ATM除非时这个人使用完毕。

    互斥锁多为多线程使用,也是为了保护资源只被某一个对象使用。或者某一个线程使用。

    其实这个例子并不是很好理解

    可以改成:

     class TestClass
        {
            public void Test()
            {
                string staticStringName = "CSharp";
    
                using (var m = new Mutex(false, staticStringName))
                {
                    if (!m.WaitOne(TimeSpan.FromSeconds(5),false) )
                    {
                        Console.WriteLine("有另一个Test方法在运行 ");
                    }
                    else
                    {
                        Console.WriteLine("Test方法正在运行");
    
                        Console.ReadKey();
    
                        m.ReleaseMutex();                               
                    }
                }            
            }
        }
        class Program
        {
            
            static void Main(string[] args)
            {
                var a = new TestClass();
    
                new Thread(() => { a.Test(); }).Start();
                new Thread(() => { a.Test(); }).Start();
                Console.ReadKey();
    
            }
        }

    这个方法相对原书的代码较为简单。

    两个不同线程访问同一个资源。

    但是第二线程只有等待第一个线程才可以访问。

    用法很接近monitor.tryenter。

    都是可以等待某一个资源是否访问。并且可以做出判断。

    但是这个mutex的适用范围更广,不论是线程还是进程都是可以使用的,像是原书则是进程之间的互斥锁。

    我的例子则是线程的例子。

    来具体的解释一下原书代码

    1 const string MutexName = "CSharpThreadingCookbook";
    2 
    3 using (var m = new Mutex(false, MutexName))

    Mutex执行的根本就是互斥锁。

    那么用来作为锁的对象是谁呢?那就是MutexName的静态资源。

    然是建立互斥锁

    new Mutex(false, MutexName)

    那么第一个参数是什么?

    是当前调用的线程是否此线程的所有权,也可以直接理解为是否直接加锁。

    第二个参数是互斥锁的名称

    这个资源锁的名字就是互斥锁的名字,也就是说互斥锁在全局中只有这么一个唯一的名字。

    其实Mutex的用法是相对简单了。只不过书上没介绍而已。

    我们还是先说原书代码

      if (!m.WaitOne(TimeSpan.FromSeconds(5),false) )

    这句

    我们说在实例化mutex的时候参数如果是false 是当前调用的线程是没有所有权的。但靠什么来获取线程锁呢?

    也就是靠waitone方法!

    WaitOne是用来获取互斥锁,

    WaitOne有几个差不多的重载方法。

    第一个参数是等待时间,可以用TimeSpan,Int

    第二个是否退出同步域

    感觉上用法适合TryEnter差不多的

    再说代码:

    m.ReleaseMutex();           

    这个就是释放一次互斥锁。

    一般用完资源之后就要释放,不然后面就等待这个互斥锁了。

    虽然了解了书上的用法但是还有一点点的疑问

  • 相关阅读:
    国内最火的3款前端开发框架
    Cordova是做什么的
    老师你好。使用cordova生成的hellowold 的安卓5.0版本太高。怎么才可以生成4.4的呢?
    一个类似bootstrap的foundation
    role在标签中的作用是什么?
    如何做到根据不同的进度用不同的颜色显示整个进度条
    wall 和panel有啥区别
    git ignore
    eclipse js 引用跳转
    计划
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9307993.html
Copyright © 2011-2022 走看看