2011年10月16日日曜日

Mono 2.10.XでMutexがおかしい

.NETアプリをMono(Microsoft .NET Frameworkのopen sourceなimplementation)で動かそうと思い、MonoDevelop 2.8.1でbuildし実行!と思ったら不可解な現象に遭遇。
どうやらThreading.Mutexを作成し、初回のWaitOneでfalseが返されることがあるようだ・・・ナニコレ(;´Д`)
以下のコードをMono 2.10.6で実行すると、最初のWaitOneがfalseを返してくる。
(40%くらいの確率でループ内の最初の1,2回だけfalseが返り、後はちゃんとtrueが返ってくる)
とりあえずtrueになるまでリトライすればOKということにしておこう。
(後、Thread.Sleepが全く効いてない現象も発生。P/InvokeでSleep API何かおかしい?)


using System;
using System.Threading;


namespace MutexBugTest
{
    class MainClass
    {
        private static Mutex mLockStatus = new Mutex();


        public static void Main (string[] args)
        {
            for(int i=0;i<100;++i)
            {
                if (!mLockStatus.WaitOne(5000))
                    Console.WriteLine("WaitOne is returned false. #" + i.ToString());       
                else
                    mLockStatus.ReleaseMutex();
            }
        }
    }
}

0 件のコメント:

コメントを投稿