Skip to main content
Post Reopened by Stephen Cleary c#
Post Closed as "Duplicate" by Servy, Peter Duniho c#
adding a tag for search improvement and minor formatting improvements
Source Link

I have a code that looks a bit like that. I have a method "do_it"do_it that does the work and uses some resources that must be protected by a mutexmutex. To do it, I tried using a mutex before calling it, to force other tasks to block until the work is done. But the mutex does not block the second task, and both runs in paralell, I would like to know why, and what is the best way to do it.

using System; using System.Threading; using System.Threading.Tasks; namespace teste_threads { class test_mutex { Mutex mut = new Mutex(); public async Task first() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task second() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task do_it() { await Task.Run(() => doSomething()); } private void doSomething() { Console.WriteLine("doSomething starting"); Thread.Sleep(1000); Console.WriteLine("doSomething ending"); } } class Program { static test_mutex test = new test_mutex(); static void Main(string[] args) { test.first(); Thread.Sleep(100); test.second(); Thread.Sleep(3000); } } } 

I was expecting that the output to this code would be:

doSomething starting doSomething ending doSomething starting doSomething ending 

but instead, I get:

doSomething starting doSomething starting doSomething ending doSomething ending 

that means the mutex is not blocking when second() is called. What is wrong with that mutex?

I have a code that looks a bit like that. I have a method "do_it" that does the work and uses some resources that must be protected by a mutex. To do it, I tried using a mutex before calling it, to force other tasks to block until the work is done. But the mutex does not block the second task, and both runs in paralell, I would like to know why, and what is the best way to do it.

using System; using System.Threading; using System.Threading.Tasks; namespace teste_threads { class test_mutex { Mutex mut = new Mutex(); public async Task first() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task second() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task do_it() { await Task.Run(() => doSomething()); } private void doSomething() { Console.WriteLine("doSomething starting"); Thread.Sleep(1000); Console.WriteLine("doSomething ending"); } } class Program { static test_mutex test = new test_mutex(); static void Main(string[] args) { test.first(); Thread.Sleep(100); test.second(); Thread.Sleep(3000); } } } 

I was expecting that the output to this code would be:

doSomething starting doSomething ending doSomething starting doSomething ending 

but instead, I get:

doSomething starting doSomething starting doSomething ending doSomething ending 

that means the mutex is not blocking when second() is called. What is wrong with that mutex?

I have a code that looks a bit like that. I have a method do_it that does the work and uses some resources that must be protected by a mutex. To do it, I tried using a mutex before calling it, to force other tasks to block until the work is done. But the mutex does not block the second task, and both runs in paralell, I would like to know why, and what is the best way to do it.

using System; using System.Threading; using System.Threading.Tasks; namespace teste_threads { class test_mutex { Mutex mut = new Mutex(); public async Task first() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task second() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task do_it() { await Task.Run(() => doSomething()); } private void doSomething() { Console.WriteLine("doSomething starting"); Thread.Sleep(1000); Console.WriteLine("doSomething ending"); } } class Program { static test_mutex test = new test_mutex(); static void Main(string[] args) { test.first(); Thread.Sleep(100); test.second(); Thread.Sleep(3000); } } } 

I was expecting that the output to this code would be:

doSomething starting doSomething ending doSomething starting doSomething ending 

but instead, I get:

doSomething starting doSomething starting doSomething ending doSomething ending 

that means the mutex is not blocking when second() is called. What is wrong with that mutex?

Source Link
Xultz
  • 81
  • 1
  • 4

Mutex does not block async method

I have a code that looks a bit like that. I have a method "do_it" that does the work and uses some resources that must be protected by a mutex. To do it, I tried using a mutex before calling it, to force other tasks to block until the work is done. But the mutex does not block the second task, and both runs in paralell, I would like to know why, and what is the best way to do it.

using System; using System.Threading; using System.Threading.Tasks; namespace teste_threads { class test_mutex { Mutex mut = new Mutex(); public async Task first() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task second() { mut.WaitOne(); await do_it(); mut.ReleaseMutex(); } public async Task do_it() { await Task.Run(() => doSomething()); } private void doSomething() { Console.WriteLine("doSomething starting"); Thread.Sleep(1000); Console.WriteLine("doSomething ending"); } } class Program { static test_mutex test = new test_mutex(); static void Main(string[] args) { test.first(); Thread.Sleep(100); test.second(); Thread.Sleep(3000); } } } 

I was expecting that the output to this code would be:

doSomething starting doSomething ending doSomething starting doSomething ending 

but instead, I get:

doSomething starting doSomething starting doSomething ending doSomething ending 

that means the mutex is not blocking when second() is called. What is wrong with that mutex?