最後に編集は次のとおりです。
2 つの異なるプロセスをセマフォと同期しています。
var semaphore = new Semaphore(0, 1, "semName");
したがって、プロセスAとプロセスBがあり、たまたま異なる実行可能ファイルです。
プロセスA
static void Main(string[] args)
{
Console.Write("Process A");
Task.Factory.StartNew(() =>
{
var semaphoreName = "sem";
var semaphore = Semaphore.OpenExisting(semaphoreName);
Thread.Sleep(100);
semaphore.Release();
semaphore.WaitOne();
semaphore.Release();
Console.Write("Process A Completed!");
});
Console.Read();
}
プロセス B (別のコンソール アプリ)
static void Main(string[] args)
{
Console.Write("Process B");
Task.Factory.StartNew(() =>
{
var semaphoreName = "sem";
var semaphore = new Semaphore(0, 1, semaphoreName);
semaphore.WaitOne();
Thread.Sleep(1000);
semaphore.Release();
semaphore.WaitOne();
Console.Write("Process B Completed!");
});
Console.Read();
}
プロセスをデバッグするか、配置するThread.Sleep
と、最後の行に到達できます。Console.Write("Process A Completed!");
配置せずにこの問題を解決するにはどうすればよいThread.Sleep(100);
ですか?
編集
競合状態はありません!! たぶん私が間違っているのなら、私を訂正してください。とにかく、競合状態がないと思う理由は次のとおりです。
プロセスA
static void Main(string[] args)
{
Console.Write("Process A");
var semaphoreName = "sem";
Task.Factory.StartNew(() =>
{
var semaphore = Semaphore.OpenExisting(semaphoreName);
semaphore.Release();
semaphore.WaitOne();
// this line should never be reached but it is!!!
Console.Write("Process A Completed!");
});
Console.Read();
}
プロセスB
static void Main(string[] args)
{
Console.Write("Process B");
var semaphoreName = "sem";
Task.Factory.StartNew(() =>
{
var semaphore = new Semaphore(0, 1, semaphoreName);
semaphore.WaitOne();
// important to have these lines
int a = 0;
for (var i = 0; i < 1000000000; i++)
a = i;
Thread.Sleep(10000); // there should not be a race condition any more!!!!
Console.Write("Process B Completed!");
});
Console.Read();
}
プロセス A では、次の行に到達してはならないことに注意してConsole.Write("Process A Completed!");
ください。
プロセス B は 10000 秒間スリープするため、競合状態が発生する理由はありません。さらに、ループを削除すると、for (var i = 0; i < 1000000000; i++)
その動作は得られません。