Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Usage of Mutex in c#

I am a bit new in threading in c# and on general, in my program I am using mutex to allow only 1 thread getting inside a critical section and for unknown reason with doing some cw prints I can see that more than 1 thread is getting inside my critical section and this is my code :

Mutex m = new Mutex(); m.WaitOne(); <C.S> // critical section here m.ReleaseMutex(); 

I would very much like to know if I am doing a mistake here thanks in advance for your kind help.

EDIT:

My code include classes so it basically looks more like this:

public class test {     private mutex m;     public test()     {          m = new mutex();     }     public func()     {          m.WaitOne();          <C.S> // critical section here          m.ReleaseMutex();      }       }  
like image 203
Nadav Avatar asked Apr 22 '11 11:04

Nadav


People also ask

What is the use of mutex in C?

A Mutex is a lock that we set before using a shared resource and release after using it. When the lock is set, no other thread can access the locked region of code.

Why do we use mutex?

Mutex or Mutual Exclusion Object is used to give access to a resource to only one process at a time. The mutex object allows all the processes to use the same resource but at a time, only one process is allowed to use the resource. Mutex uses the lock-based technique to handle the critical section problem.

What is mutex example?

Example 4-1 Mutex Lock ExampleThe get_count() function uses the mutex lock to guarantee that the 64-bit quantity count is read atomically. On a 32-bit architecture, a long long is really two 32-bit quantities. Reading an integer value is an atomic operation because integer is the common word size on most machines.


2 Answers

The problem here is that all your callers are using a different mutex; you need the locking object to be shared, usually by making it a field. For example, and switching to a simpler lock metaphor:

private readonly object syncLock = new object(); public void ThreadSafeMethod() {     lock(syncLock) {         /* critical code */     } } 

or using the mutex:

private readonly Mutex m = new Mutex(); public void ThreadSafeMethod() {     m.WaitOne();     try {         /* critical code */     } finally {         m.ReleaseMutex();     } } 
like image 95
Marc Gravell Avatar answered Sep 21 '22 04:09

Marc Gravell


It looks like you give each Thread its own Mutex. That won't work.

And a Mutex is overkill in most situations. You only need:

private static object syncLock = new object();  // just 1 instance  ....  lock(syncLock) {     // critical section } 
like image 26
Henk Holterman Avatar answered Sep 21 '22 04:09

Henk Holterman