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();
}
}
This pattern does no locking at all. Every thread creates a new Mutex object and immediately owns the lock for it. Other threads create and use a new Mutex itself.
Consider using a regular lock()!
where _lockobject is a simple private variable in your class:
Edit: thanks to the commenters! Situations exist, where lock(this) can be dangerous. So I removed that.
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:
Mutex use to identify run app instance.
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:or using the mutex: