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