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類可以做到這一點,當你不必重新創建它時總會更好。 –