C#多线程中如何运用互斥锁Mutex

 更新时间:2017年06月22日 11:02:22   作者:小恩  
这篇文章主要为大家详细介绍了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();
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于C#中的字体别名问题

    关于C#中的字体别名问题

    在C#中使用Graphics对象的DrawString方法绘制文本时,可以通过设置TextRenderingHint属性来控制字体混叠效果,对于14号或更大的字体,建议使用AntiAliasGridFit;对于8到14点之间的字体,建议使用AntiAlias;对于小于8点的字体,建议使用ClearTypeGridFit
    2025-01-01
  • C#调用OpenCV开发简易版美图工具【推荐】

    C#调用OpenCV开发简易版美图工具【推荐】

    本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-10-10
  • C#调用dos窗口获取相关信息的方法

    C#调用dos窗口获取相关信息的方法

    这篇文章主要介绍了C#调用dos窗口获取相关信息的方法,涉及C#调用dos窗口及进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# foreach获取循环索引的四种方法

    C# foreach获取循环索引的四种方法

    在C#中使用foreach循环的时候我们有时会碰到需要索引的情况,在for循环中我们可以得到循环索引 , foreach并不直接提供 , 下面介绍4种foreach获取索引的方法,希望对大家有用处,需要的朋友可以参考下
    2025-03-03
  • C#如何正确实现一个自定义异常Exception

    C#如何正确实现一个自定义异常Exception

    这篇文章主要为大家详细介绍了C#如何正确实现一个自定义异常Exception,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • C#使用NPOI读取excel转为DataSet

    C#使用NPOI读取excel转为DataSet

    这篇文章主要为大家详细介绍了C#使用NPOI读取excel转为DataSet,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C# FTP操作类分享

    C# FTP操作类分享

    这篇文章主要为大家分享了C# FTP操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 使用C#实现网页内容保存为图片并生成压缩包

    使用C#实现网页内容保存为图片并生成压缩包

    这篇文章主要为大家详细介绍了如何使用C#实现网页内容保存为图片并生成压缩包,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C#实现将聊天数据发送加密

    C#实现将聊天数据发送加密

    这篇文章主要为大家详细介绍了如何利用C#实现将聊天数据发送加密的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 浅谈c#中const与readonly区别

    浅谈c#中const与readonly区别

    C#引入了readonly修饰符来表示只读域,const来表示不变常量。顾名思义对只读域不能进行写操作,不变常量不能被修改,这两者到底有什么区别呢?
    2015-06-06

最新评论