По некоторым причинам я должен придерживаться .NET 3.5, и мне нужна функциональность класса Barrier из .NET 4. У меня есть несколько потоков, которые выполняют некоторую работу, и я хочу, чтобы они ждали друг друга, пока все не будет сделано , Когда все будет сделано, я хочу, чтобы они делали работу снова и снова подобным образом.
Воодушевленный потоком Разница между Barrier в C # 4.0 и WaitHandle в C # 3.0? Я решил реализовать функциональность Barrier с классами AutoResetEvent и WaitHandle.
Хотя я столкнулся с проблемой с моим кодом:
class Program
{
const int numOfThreads = 3;
static AutoResetEvent[] barrier = new AutoResetEvent[numOfThreads];
static Random random = new Random(System.DateTime.Now.Millisecond);
static void barriers2(object barrierObj)
{
AutoResetEvent[] barrierLocal = (AutoResetEvent[])barrierObj;
string name = Thread.CurrentThread.Name;
for (int i = 0; i < 10; i++)
{
int sleepTime = random.Next(2000, 10000);
System.Console.Out.WriteLine("Thread {0} at the 'barrier' will sleep for {1}.", name, sleepTime);
Thread.Sleep(sleepTime);
System.Console.Out.WriteLine("Thread {0} at the 'barrier' with time {1}.", name, sleepTime);
int currentId = Convert.ToInt32(name);
//for(int z = 0; z < numOfThreads; z++)
barrierLocal[currentId].Set();
WaitHandle.WaitAll(barrier);
/*
for (int k = 0; k < numOfThreads; k++)
{
if (k == currentId)
{
continue;
}
System.Console.Out.WriteLine("Thread {0} is about to wait for the singla from thread: {1}", name, k);
barrierLocal[k].WaitOne();
System.Console.Out.WriteLine("Thread {0} is about to wait for the singla from thread: {1}. done", name, k);
}
*/
}
}
static void Main(string[] args)
{
for (int i = 0; i < numOfThreads; i++)
{
barrier[i] = new AutoResetEvent(false);
}
for (int i = 0; i < numOfThreads; i++)
{
Thread t = new Thread(Program.barriers2);
t.Name = Convert.ToString(i);
t.Start(barrier);
}
}
}
Вывод, который я получаю, выглядит следующим образом:
Поток 0 у «барьера» будет спать на 7564
Поток 1 у «барьера» будет спать 5123
Поток 2 у «барьера» будет спать 4237
Резьба 2 у «барьера» со временем 4237
Поток 1 у «барьера» со временем 5123
Нить 0 у «барьера» со временем 7564
Поток 0 у «барьера» будет спать 8641
Нить 0 у «барьера» со временем 8641
И это все. После последней строки больше нет вывода, и приложение не завершает работу. Похоже, что есть какой-то тупик. Однако не могу найти проблему. Любая помощь приветствуется.
Спасибо!