线程屏障(System.Threading.Barrier)

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

线程屏障

  1. using System;
  2. using System.Threading;
  3.  
  4. namespace ConsoleApp12
  5. {
  6. internal class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var app = new BarrierDemo();
  11. Thread t1 = new Thread(() => app.CrunchNumbers());
  12. Thread t2 = new Thread(() => app.CrunchNumbers());
  13. t1.Start();
  14. t2.Start();
  15.  
  16. Console.ReadKey();
  17. }
  18. }
  19.  
  20. public class BarrierDemo
  21. {
  22. public Barrier barrier = null;
  23.  
  24. public BarrierDemo()
  25. {
  26. barrier = new Barrier(2, (bar) =>
  27. {
  28. Console.WriteLine("Barrier post-phase action, thread id={0}",
  29. Thread.CurrentThread.ManagedThreadId);
  30. });
  31. }
  32.  
  33. public void CrunchNumbers()
  34. {
  35. for (int i = 0; i < 5; i++)
  36. {
  37. Console.WriteLine("CrunchNumbers i={0}, thread id={1}",
  38. i,
  39. Thread.CurrentThread.ManagedThreadId);
  40.  
  41. try
  42. {
  43. //等待所有参与者线程都执行到这里时,最后一个到达这里的线程会执行
  44. //barrier的postPhaseAction回调方法,然后所有参数者线程又继续往下执行。
  45.  
  46. //如果执行到这里的线程少于设置的参与者数量,程序将一直卡在这里等待。
  47. //如果执行到这里的线程多于设置的参与者数量,将引发InvalidOperationException异常
  48. barrier.SignalAndWait(10000);//设置个等待超时时间避免死锁
  49. }
  50. catch (InvalidOperationException)
  51. {
  52. Console.WriteLine("使用该屏障的线程的数目已超过已注册参与者的总数。");
  53. }
  54. }
  55. }
  56. }
  57. }

运行测试

111111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号