Mutex and Semaphore
Explore additional thread synchronization primitives.
We'll cover the following
Synchronization using mutex
The word mutex stands for mutual exclusion. It’s a special object that can restrict access to a critical section of the code. In essence, there’s nothing much that separates a mutex from the lock
statement or the Monitor
class. We create a mutex object and, whenever we enter a critical section, we acquire the lock for the mutex. If the mutex has already been acquired by another thread, then the thread has to wait until the mutex is released.
Note: The mutex in .NET is represented by a class called
Mutex
, which resides in theSystem.Threading
namespace.
Unlike the lock
statement and Monitor
, Mutex
doesn’t need a separate locker object because it serves this purpose itself:
// Mutex
static Mutex mutex = new Mutex();
static void SomeMethod()
{
// Critical section begins here
mutex.WaitOne();
try
{
// Critical section code
}
finally
{
// Release the mutex
mutex.ReleaseMutex();
}
}
Notice that there’s almost no difference in structure between Mutex
and Monitor
. The only notable difference is that we haven’t created an empty object
instance as a locker. The Mutex
instance uses itself as this locker object.
The main synchronization is done by the WaitOne()
and ReleaseMutex()
methods. The WaitOne()
method suspends thread execution until the mutex object is obtained.
Initially, the mutex is free, so one of the threads gets it.
After all actions have been completed and the mutex is no longer needed, the thread releases it using the ReleaseMutex()
method. Then, the mutex is acquired by one of the waiting threads.
When execution reaches a call to WaitOne()
, the thread waits until the mutex is released. After receiving it, it continues to do its job.
Get hands-on with 1400+ tech skills courses.