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

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

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

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

  • 相关阅读:
    datanode报错Problem connecting to server
    使用命令查看hdfs的状态
    Access denied for user root. Superuser privilege is requ
    ElasticSearch默认的分页参数 size
    SparkStreaming Kafka 维护offset
    【容错篇】Spark Streaming的还原药水——Checkpoint
    251 Android 线性与相对布局简介
    250 Android Studio使用指南 总结
    249 如何解决项目导入产生的中文乱码问题
    248 gradle更新问题
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9307993.html
Copyright © 2011-2022 走看看