线程屏障(System.Threading.Barrier)

作者:追风剑情 发布于:2024-1-23 13:09 分类:C#

线程屏障

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("使用该屏障的线程的数目已超过已注册参与者的总数。");
                }
            }
        }
    }
}

运行测试

111111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号