How to Use Mutual Exclusion Lock Mutex in C Multithreading

  • 2021-12-21 04:48:14
  • OfStack

Mutex (Mutex)

A mutex is a mutex synchronization object, which means that only one thread can acquire it at the same time.

Mutex can be used when a shared resource can only be accessed by one thread at a time

Function:


// Create 1 Mutex in unacquired state 
Public Mutex (); 
// If owned For true The initial state of the mutex is acquired by the main thread, otherwise it is in the unacquired state 
Public Mutex ( bool owned ); 

If you want to acquire 1 mutex. The WaitOne () method on the mutex should be called, which inherits from the Thread. WaitHandle class

It is in a wait state until the called mutex can be acquired, so this method will organize the main thread until the specified mutex is available. If it is not necessary to own the mutex, it will be released by ReleaseMutex method, so that the mutex can be acquired by another thread.


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 + " Waiting  the mutex");
   // Application 
   shareRes.mutex.WaitOne();
   Console.WriteLine(thrd.Name + " Apply to  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 + " Release  the nmutex");
   //  Release 
   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 + " Waiting  the mutex");
   // Application 
   shareRes.mutex.WaitOne();
   Console.WriteLine(thrd.Name + " Apply to  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 + " Release  the nmutex");
   //  Release 
   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();
  }
 }
}

Related articles: