zoukankan      html  css  js  c++  java
  • C# 中使用锁防止多线程冲突

    在编程的时候经常会用到多线程,有时候如果多线程操作同一个资源就会导致冲突,.NET提供了多种方法来防止冲突发生,这里讲下Mutex

    该类位于System.Threading命名空间,常用的方式是这样:

    var mutex = new Mutex(true, "Test", out var flag);

    参数分别是:

    1:给调用线程赋予互斥体的初始所属权

    2:锁名称

    3:如果调用线程已被授予互斥体的初始所属权,则返回true

    notice:这个锁的有效范围是全系统

    也就是说不同进程之间如果锁名称相同会互相影响.使用时需要注意这点.

    代码:

            static void Main(string[] args)
            {
                var mutex = new Mutex(true, "Test", out var flag);
                {
                    Task.Factory.StartNew(Th);
    
                    Console.WriteLine(flag.ToString());
                    Console.WriteLine("按任意键继续:");
    
                    Console.ReadKey(true);
                    mutex.ReleaseMutex();
                }
                Console.ReadKey(true);
            }
            
            private static void Th()
            {
                var mutex = new Mutex(true, "Test", out var flag);
                {
                    if (!flag)
                    {
                        //等待3s互斥锁
                        flag = mutex.WaitOne(3000, true);
                        if (flag)
                        {
                            Console.Write(1);
                        }
                        else
                        {
                            Console.Write("没有得到互斥锁,尝试无限等待...");
                            //无限等待互斥锁
                            mutex.WaitOne();
                            Console.Write(1);
                        }
                    }
                    mutex.ReleaseMutex();
                }
            }
  • 相关阅读:
    JavaScript——引用类型
    react+express+mongodb搭建个人博客
    JavaScript——变量及其作用域
    CSS——盒子模型
    CSS——浮动及清除浮动
    hexo博客分支教训
    使用Node.js+Express 简易开发服务端实例
    发布Nuget包命令
    当心引用类型的“坑”
    sqlcmd相关
  • 原文地址:https://www.cnblogs.com/DragonStart/p/7654951.html
Copyright © 2011-2022 走看看