线程屏障
using System;
using System.Threading;
namespace ConsoleApp12
{
internal class Program
{
static void Main(string[] args)
{
var app = new BarrierDemo();
Thread t1 = new Thread(() => app.CrunchNumbers());
Thread t2 = new Thread(() => app.CrunchNumbers());
t1.Start();
t2.Start();
Console.ReadKey();
}
}
public class BarrierDemo
{
public Barrier barrier = null;
public BarrierDemo()
{
barrier = new Barrier(2, (bar) =>
{
Console.WriteLine("Barrier post-phase action, thread id={0}",
Thread.CurrentThread.ManagedThreadId);
});
}
public void CrunchNumbers()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("CrunchNumbers i={0}, thread id={1}",
i,
Thread.CurrentThread.ManagedThreadId);
try
{
//等待所有参与者线程都执行到这里时,最后一个到达这里的线程会执行
//barrier的postPhaseAction回调方法,然后所有参数者线程又继续往下执行。
//如果执行到这里的线程少于设置的参与者数量,程序将一直卡在这里等待。
//如果执行到这里的线程多于设置的参与者数量,将引发InvalidOperationException异常
barrier.SignalAndWait(10000);//设置个等待超时时间避免死锁
}
catch (InvalidOperationException)
{
Console.WriteLine("使用该屏障的线程的数目已超过已注册参与者的总数。");
}
}
}
}
}
运行测试