[MonoDevelop] Monitor.Wait return false immediately on Mono Runtime

Nicolas Krzywinski opensource at site7even.de
Sun Sep 18 12:07:52 EDT 2011


Hello,

you have built a beautiful example of a racing condition.

Let me explain what your code does in my opinion:

1. Spawn thread that executes Async()
2. Ensleeps this thread for 3 seconds
=> Now it is unsure how far the thread was able to execute: is it already  
sitting on the lock?

3. 3 seconds passed, thread is resumed and the Main method as well
=> Now it depends on first: the thread already sitting on the lock? and  
second: how quickly a thread can be resumed by the runtime?

==> Depending on those (multiple) speed conditions either the main method  
or the thread will reach the lock first!

Your example shows us that .NET and Mono is implemented different in that  
case.

Regards,
7even

Am 18.09.2011, 04:49 Uhr, schrieb mono <mono at webkai.net>:

> Hello
>
> I am using Monodevelop2.6 on Windows Vista.
>
> I build a following code by .NET Runtime.
> Then, 'True' is displayed in 3 second later.
>
> Next, I build by mono2.10.5 runtime.
> And I execute it. But 'False' is displayed in console immediately.
>
> Please, Advice.
>
>
> using System;
> using System.Threading;
>
> namespace MonoThreadTest
> {
>  class MainClass
>  {
>   static object lockObj = new object();
>  public static void Main (string[] args)
>   {
>    new Thread(new ThreadStart(Async)).Start();
>   Thread.Sleep(3 * 1000);
>   lock(lockObj)
>    {
>     Monitor.PulseAll(lockObj);
>    }
>   Console.Read();
>   }
>  static void Async()
>   {
>    lock(lockObj)
>    {
>     Console.WriteLine(Monitor.Wait(lockObj, 10 * 1000));
>    }
>   }
>  }
> }
>


-- 
www.site7even.de | www.nskcomputing.de


More information about the Monodevelop-list mailing list