Using Mutex to avoid deadlocks
By | August 22, 2011

Mutex is not new to the .NET framework. The Win32 api supports an object called Mutex and .NET framework class Mutex is actually a wrapper class for the same Win32 kernel mutex object. Mutex objects are generally used to synchronize Threads across process. Mutexes are namable and hence you can signal whether the Mutex is acquired or not by some other thread in probably some different process. You should note a Mutex is created with the call of Win32 CreateMutex call. You can check ownership of the Mutex using WaitAll, WaitAny etc calls and which avoids deadlocks.

As I have already told you, Mutex has an underlying Win32 kernel object associated with it, even though it supports cross process thread synchronization, yet it is heavier than Monitor and you need to explicitly close the mutex when it is released.

Lets us use Mutex in code to clear how you could use Mutex.

static Mutex _mlock = new Mutex();
public static long Sum()
{
    long counter = 0;
    if (_mlock.WaitOne(1000))
    {
        try
        {
            for (int i = 0; i < Repository.Count; i++)
                Interlocked.Add(ref counter, Repository[i]);
        }
        finally
        {
            _mlock.ReleaseMutex();
        }
    }
    return counter;
}

public static void AddToRepository(int nos)
{
    if (_mlock.WaitOne(2000))
    {

        try
        {
            for (int i = 0; i < nos; i++)
                Repository.Add(i);
        }
        catch { }
        finally
        {
            _mlock.ReleaseMutex();
        }
    }
}

In this code, I have created a Mutex and a lock is acquired using the WaitOne method of Mutex object. We have also specified the Timeout value for the Mutex. If the Timeout is elapsed, the Mutex returns false.

If you have more than one Mutex needs to be acquired before running a code, you can put all the Mutexes in an array and call WaitHandle.WaitAll to acquire all Mutexes at a time.

Mutex[] mutexes = { this._mlock, this._mlock2, this._mlock3};
if(WaitHandle.WaitAll(mutexes))
{
      // All mutexex acquired.
}

The WaitHandle method actually avoids the deadlock internally.
Similar to WaitAll the WaitHandle class also supports methods like WaitAny or SignalAndWait methods to acquire locks.

Use Mutex for Instance Count?

As I have already told you, Mutexes can be named and can be accessed across process, you can use Mutex to count the number of instances of a certain Thread is created in a particular machine. Lets see how to do this :

bool instanceCountOne = false;
Mutex mutex = new Mutex(true, "MyMutex", out instanceCountOne);
 using (mutex)
 {
      if (instanceCountOne)
      {
            // When there is only one Instance
       }
  }

Here we name the Mutex as MyMutex which will count all the existing processes of the System and see whether the MyMutex is newly created or its already there. The instanceCountOne identifies whether the name is newly created or not. Thus it will identify the instance count of the Mutex.

If you write this code at the Entry point of your application, you can look at how many instance of the application actually exists in the system.

I hope this post helps you.

Thank you for reading.