.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 件のコメント:
コメントを投稿