欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-26 23:21:04
互斥锁(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();
  }
 }
}

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