using System;
using System.Threading;
namespace Threading
{
class Program
{
static void Main(string[] args)
{
Semaphore even = new Semaphore(1, 1);
Semaphore odd = new Semaphore(1, 1);
Thread evenThread = new Thread(() =>
{
for (int i = 1; i <= 100; i++)
{
even.WaitOne();
if(i % 2 == 0)
{
Console.WriteLine(i);
}
odd.Release();
}
});
Thread oddThread = new Thread(() =>
{
for(int i = 1; i <=100; i++)
{
odd.WaitOne();
if(i%2 != 0)
{
Console.WriteLine(i);
}
even.Release();
}
});
oddThread.Start();
evenThread.Start();
}
}
}
所以我写了这个代码,其中一个线程正在生成奇数并且其他正在生成偶数。此代码是否会导致死锁?
使用Semaphores
我确信他们在订单中打印数字并且完美地工作。
但我有一个特殊的情况,例如每个线程一直等到另一个线程释放它的信号。那么是否会出现这样一种情况,即两个线程都在等待,并且没有线程正在取得进展,并且存在死锁情况?
错误地初始化信号将很容易做到。请注意,你做错了,你创建了一个竞争条件,两个线程都会同时尝试WriteLine()。理想情况下,它会崩溃,因为你在一个没有等待但不会经常发生的信号量上调用Release。但不,没有僵局。 System.Threading.Barrier类可以做到这一点,当你不必重新创建它时总会更好。 –