最后是编辑:
我正在使用信号量同步两个不同的进程:
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++)
,我不会得到那种行为。