看一下 Barrier
类,它允许 n
个线程在同一时间点上进行会合:
static Barrier _barrier = new Barrier(3);
static void Main()
{
new Thread(Speak).Start();
new Thread(Speak).Start();
new Thread(Speak).Start();
}
static void Speak()
{
for (int i = 0; i < 5; i++)
{
Console.Write(i + " ");
_barrier.SignalAndWait();
}
}
//OUTPUT: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
但是
CountdownEvent
类也一样:static CountdownEvent _countdown = new CountdownEvent(3);
static void Main()
{
new Thread(SaySomething).Start("I am thread 1");
new Thread(SaySomething).Start("I am thread 2");
new Thread(SaySomething).Start("I am thread 3");
_countdown.Wait(); // Blocks until Signal has been called 3 times
Console.WriteLine("All threads have finished speaking!");
}
static void SaySomething(object thing)
{
Thread.Sleep(1000);
Console.WriteLine(thing);
_countdown.Signal();
}
// output :
I am thread 3
I am thread 1
I am thread 2
All threads have finished speaking!
似乎
Barrier
会阻塞直到n
个线程相遇,而CountdownEvent
也会阻塞直到有n
个线程发出信号。这对我来说有点混乱,我不知道在什么情况下应该使用哪一个。
问题:
在哪些(现实生活)场景中应该选择使用
Barrier
而不是CountdownEvent
(反之亦然)?
_countdown.Signal()
处抛出了InvalidOperationException
异常。 - Keyur Ramoliya