I am just experimenting on Mutex and wrote the following code.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Mutex_WaitOnewithTimeouts
{
class Program
{
private static Mutex mut = new Mutex();
private static int numOfThreads = 5;
private static int numOfIterations = 3;
private static Random rand = new Random();
static void Main(string[] args)
{
Thread[] threads = new Thread[5];
for (int num = 0; num < numOfThreads; num++)
{
threads[num] = new Thread(new ThreadStart(MyThreadProc));
threads[num].Name = String.Format("Thread{0}", num);
threads[num].Start();
}
Console.Read();
}
private static void MyThreadProc()
{
for (int iteration = 0; iteration < numOfIterations; iteration++)
{
UseResource();
}
}
private static void UseResource()
{
Console.WriteLine("{0} accessing ", Thread.CurrentThread.Name);
int time = (int)(rand.NextDouble() * 100);
try
{
if (mut.WaitOne(time))
{
Console.WriteLine("Yippie got mutex for {0}", Thread.CurrentThread.Name);
Thread.Sleep((int)rand.NextDouble() * 5000);
}
else
{
Console.WriteLine("Nopee.... Timeout occured for {0}", Thread.CurrentThread.Name);
}
}
catch (AbandonedMutexException ex)
{
Console.WriteLine(" Exception is caught");
}
finally
{
Console.WriteLine("Releasing mutex for {0}", Thread.CurrentThread.Name);
mut.ReleaseMutex();
}
}
}
}
But I am getting ApplicationException sometimes.. Can someone please help me if there is anything wrong with my code and also please explain when will this exception trigger.
Object synchronization method was called from an unsynchronized block of code. I am getting this in the finally block when trying to release the mutex.
You are releasing the mutex even if your WaitOne failed. Move the ReleaseMutex call inside the if statement where you know you have the mutex obtained.