<div dir="ltr">Hi,<div><br></div><div>  mono used to support this functionality, but the code to do that was very problematic, and it is disabled in recent mono releases.</div><div><br></div><div>           Zoltan</div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jul 2, 2014 at 9:31 PM, Edward Ned Harvey (mono) <span dir="ltr"><<a href="mailto:edward.harvey.mono@clevertrove.com" target="_blank">edward.harvey.mono@clevertrove.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Before anything else ...  Can anybody recommend a way to do interprocess mutex?<br>
<br>
I would like to confirm this is a bug before I go create a bug report in bugzilla.  Can anybody please confirm both (a) you get the same behavior, and (b) it's not correct behavior?<br>
<br>
I want to make this observation as well:  The class in question is System.Threading.Mutex.  But on the mono class status pages, there seems to be no System.Threading.Mutex.  So that sounds a little suspicious to me, but maybe it's ok?  Or maybe I'm overlooking it somehow?<br>

<br>
Here is some sample source code:<br>
using System;<br>
using System.Threading;<br>
<br>
namespace FunWithMutex<br>
{<br>
    class MainClass<br>
    {<br>
        static string mutexName;<br>
        const int numThreads = 5;<br>
        static Thread[] allThreads = new Thread[numThreads];<br>
        public static void Main(string[] args)<br>
        {<br>
            mutexName = @"Global\mutex-test-erihjbnkjvwiuehrnkjcxvjhwehiu";<br>
            for (int i=0; i<numThreads; i++)<br>
            {<br>
                allThreads[i] = new Thread(new ThreadStart(DoSomething));<br>
                allThreads[i].Name = "Thread #" + i.ToString();<br>
                allThreads[i].Start();<br>
            }<br>
        }<br>
        static void DoSomething()<br>
        {<br>
            System.Console.Error.WriteLine(<a href="http://Thread.CurrentThread.Name" target="_blank">Thread.CurrentThread.Name</a> + " starting...");<br>
            using (var myMutex = new Mutex(false,mutexName))<br>
            {<br>
                myMutex.WaitOne();<br>
                try<br>
                {<br>
                    System.Console.Error.WriteLine(<a href="http://Thread.CurrentThread.Name" target="_blank">Thread.CurrentThread.Name</a> + " running...");<br>
                    Thread.Sleep(TimeSpan.FromSeconds(5));<br>
                    System.Console.Error.WriteLine(<a href="http://Thread.CurrentThread.Name" target="_blank">Thread.CurrentThread.Name</a> + " finished...");<br>
                }<br>
                finally<br>
                {<br>
                    myMutex.ReleaseMutex();<br>
                }<br>
            }<br>
        }<br>
    }<br>
}<br>
<br>
<br>
When run in windows .NET, you launch several processes that each run the above code, and the Mutex will only allow one process to enter at a time.<br>
<br>
When run in Mono, a single process obeys the mutex correctly, but multiple processes that are launched concurrently, each have an apparently private mutex, because each process will allow a single thread to enter the mutex concurrently.<br>

<br>
In other words, the mutex *should* provide synchronization across multiple processes, but it doesn't.  Instead, it only provides synchronization across multiple threads within a single process.<br>
<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div>