`
wyf
  • 浏览: 437938 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

Barrier 屏障使用

    博客分类:
  • C#
阅读更多

1、 System.Threading.Barrier 是同步基元,可以使多个线程(称为“参与者”)分阶段同时处理算法。 达到代码中的屏障点之前,每个参与者将继续执行。 屏障表示工作阶段的末尾。 单个参与者到达屏障后将被阻止,直至所有参与者都已达到同一障碍。 所有参与者都已达到屏障后,你可以选择调用阶段后操作。 此阶段后操作可由单线程用于执行操作,而所有其他线程仍被阻止。 执行此操作后,所有参与者将不受阻止。

解释:多线程调用同一个(也可以是不同)方法。在barrier.SignalAndWait();方法之前的逻辑可以并行执行。当遇到此方法时,线程进入等待,等待定义的等待线程全部到达此障碍,再执行后面的阶段操作(单线程)

 

//创建Barrier对象,阻止线程数为2,并提供后期委托
//在每个阶段结束时调用。
 Barrier barrier = new Barrier(2, (bar) => 
     {
         // Examine results from all threads, determine 
         // whether to continue, create inputs for next phase, etc. 
         if (someCondition)
             success = true;
     });   

 

//定义每个线程将执行的工作。 (线程不必都执行相同的方法。)
 void CrunchNumbers(int partitionNum)
 {
     // Up to System.Int64.MaxValue phases are supported. We assume
     // in this code that the problem will be solved before that.
     while (success == false)
     {
        //开始阶段:
    //在每个线程上处理数据,也可以选择
    //存储结果,例如:
         results[partitionNum] = ProcessData(data[partitionNum]);

        //结束阶段:
    //在所有线程到达后,后阶段委托
    //被调用,然后线程被解除阻塞。重载
    //接受超时值和/或CancellationToken。
         barrier.SignalAndWait();
     }
 }

//执行n个任务以并行运行。 为简单起见
//在这个例子中,所有线程都执行相同的方法。
 static void Main()
 {
     var app = new BarrierDemo();
     Thread t1 = new Thread(() => app.CrunchNumbers(0));
     Thread t2 = new Thread(() => app.CrunchNumbers(1));
     t1.Start();
     t2.Start();
     
 }

 下面为一个完成的实例:

 

//#define TRACE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace BarrierSimple
{
    class Program
    {
        static string[] words1 = new string[] { "brown",  "jumps", "the", "fox", "quick"};
        static string[] words2 = new string[] { "dog", "lazy","the","over"};
        static string solution = "the quick brown fox jumps over the lazy dog.";

        static bool success = false;
        static Barrier barrier = new Barrier(2, (b) =>
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < words1.Length; i++)
            {
                sb.Append(words1[i]);
                sb.Append(" ");
            }
            for (int i = 0; i < words2.Length; i++)
            {
                sb.Append(words2[i]);

                if(i < words2.Length - 1)
                    sb.Append(" ");
            }
            sb.Append(".");
#if TRACE
            System.Diagnostics.Trace.WriteLine(sb.ToString());
#endif
            Console.CursorLeft = 0;
            Console.Write("Current phase: {0}", barrier.CurrentPhaseNumber);
            if (String.CompareOrdinal(solution, sb.ToString()) == 0)
            {
                success = true;
                Console.WriteLine("\r\nThe solution was found in {0} attempts", barrier.CurrentPhaseNumber);
            }
        });

        static void Main(string[] args)
        {

            Thread t1 = new Thread(() => Solve(words1));
            Thread t2 = new Thread(() => Solve(words2));
            t1.Start();
            t2.Start();

            // Keep the console window open.
            Console.ReadLine();
        }

        // Use Knuth-Fisher-Yates shuffle to randomly reorder each array.
        // For simplicity, we require that both wordArrays be solved in the same phase.
        // Success of right or left side only is not stored and does not count.       
        static void Solve(string[] wordArray)
        {            
            while(success == false)
            {
                Random random = new Random();
                for (int i = wordArray.Length - 1; i > 0; i--)
                {
                    int swapIndex = random.Next(i + 1);
                    string temp = wordArray[i];
                    wordArray[i] = wordArray[swapIndex];
                    wordArray[swapIndex] = temp;
                }

                // We need to stop here to examine results
                // of all thread activity. This is done in the post-phase
                // delegate that is defined in the Barrier constructor.
                barrier.SignalAndWait();
            }
        }
    }
}

 

分享到:
评论

相关推荐

    linux memory barrier

    Linux 内核中的 Memory Barrier(内存屏障)机制用于控制处理器对内存的操作顺序,确保在并发环境下数据的一致性与可靠性。 #### 二、Memory Barrier基本概念 1. **Memory Barrier定义**:内存屏障是一种硬件指令...

    barrier:屏障模式在 JavaScript 中的实现

    屏障.js 模式在 JavaScript 中的实现。用法 'use strict' ;var barrier = require ( '@yuanqing/barrier' ) ;var b = barrier ( 2 , function ( err , result ) { if ( err ) { throw err ; } console . log ( ...

    内核同步机制-优化屏障和内存屏障

    在Linux内核中,`barrier()`宏就是一个典型的优化屏障实现,它通过`__asm__ __volatile__`来防止编译器优化,确保屏障前的指令在屏障后执行,保证特定的指令执行顺序不被改变。这样,即使在并行执行的环境中,也能...

    内存屏障原理解析

    内存屏障通常分为两种类型:读屏障(Read Barrier)和写屏障(Write Barrier)。读屏障用于强制确保屏障点之前的所有读操作在屏障点之后的任何读写操作之前完成;写屏障用于强制确保屏障点之前的所有写操作在屏障点...

    Barrier coverage in camera sensor networks

    - **屏障覆盖(Barrier Coverage)**:在传感器网络中,屏障覆盖是指在监测区域内构建一个连续的监测区域或路径,确保任何试图穿越该区域的对象都能够被检测到。 - **摄像头传感器(Camera Sensors)**:相比传统的标量...

    线程同步dispatch_barrier_(a)sync1

    它们都是用于在并发队列(concurrent queue)中创建屏障(barrier)任务,以实现特定的同步效果。 1. **共同点**: - 两者都会等待在它们前面插入队列的任务执行完毕。 - 两者都会在自己的任务执行完毕后再执行...

    使用Barrier来控制线程同步示例

    在Java或.NET等编程环境中,有多种实现线程同步的工具和类,其中之一就是 Barrier(屏障)。`Barrier` 是一种同步机制,它允许一组线程在到达一个共同的障碍点后一起继续执行,而不会相互交错。在这个示例中,我们将...

    内存屏障机制

    内存屏障(Memory Barrier),又称内存栅栏或内存围栏,是一种用于控制处理器内部内存操作顺序的机制。它确保某些类型的内存操作按指定顺序完成,从而避免了CPU内部的乱序执行可能引发的数据不一致性问题。在多...

    LINUX内核内存屏障

    4. **全屏障**(Full Barrier):最严格的屏障类型,确保所有的内存操作按顺序执行。 #### 五、Linux内核中的内存屏障 在Linux内核中,内存屏障主要用于处理多处理器环境下的同步问题,例如在SMP(Symmetric Multi...

    网络连通性维护的连续约束非光滑控制屏障函数设计_Nonsmooth Control Barrier Function Desig

    非光滑控制屏障函数(Nonsmooth Control Barrier Function, NCBF)提供了一种方法来处理这些约束,特别是那些涉及到连续性限制的问题。 非光滑控制屏障函数是一种数学工具,用于设计控制器,以确保系统的状态永远...

    mpi_barrier.rar_The Work

    在mpi_barrier.docx文档中,可能会详细解释如何在实际代码中使用MPI_BARRIER,包括示例程序、调用方式以及如何根据具体应用调整其使用。理解并合理使用MPI Barrier是编写高效、正确的MPI并行程序的基础,尤其是在...

    内存屏障访问顺序

    为了确保数据在多处理器环境下的正确顺序和一致性,通常需要使用内存屏障(Memory Barrier)。内存屏障是一种特殊的指令,它可以强制CPU按照特定的顺序执行内存操作。具体来说,内存屏障可以分为以下几类: 1. **读...

    PyPI 官网下载 | p6-barrier-0.1.77.tar.gz

    这两个模块都提供了实现barrier同步的接口,但是`p6-barrier`库可能提供了更高级、更易于使用的API,或者有特定的优化和特性,以满足不同场景下的需求。 **Python 包的安装与使用** 下载`p6-barrier-0.1.77.tar.gz...

    PyPI 官网下载 | p6-barrier-0.0.34.tar.gz

    “p6-barrier”是一个Python库,主要用于实现并发控制中的“屏障”(barrier)机制。在多线程或多进程编程中,屏障是一种同步工具,它允许一组线程或进程在某个点集体等待,直到所有线程都到达这个点后,它们才能...

    linux 内核内存屏障

    在对称多处理器(SMP)系统中,内存屏障通常成对使用,以确保一个处理器对内存的操作能够被另一个处理器正确地观察到。 #### 三、内核中显式的内存屏障 Linux内核提供了多种方式来插入显式的内存屏障: - **编译...

    乱序执行和内存屏障.pdf

    例如,在一个线程中,使用rmb内存屏障可以保证所有的加载操作都将在屏障之前完成,而在另一个线程中,使用wmb内存屏障可以保证所有的存储操作都将在屏障之前完成。 乱序执行和内存屏障是高级处理器中两个紧密相关的...

    Active Noise Barrier; phase 1 Simulation Study

    有源声屏障的模拟实验 主声源 抵消声源摆放 参考传声器、误差传声器位置及摆放 风的影响 屏障高度的影响等

    中国Linux内核开发者大会十周年演讲稿(中兴通讯谢宝友)-Linux内存屏障

    3. **内存屏障类型**:内存屏障有多种类型,如Load Barrier(读屏障)、Store Barrier(写屏障)和Full Barrier(全屏障)。他可能详细介绍了这些屏障的作用和应用场景。 4. **Linux内核中的应用**:在Linux内核中...

    barrier_leaflet pdf文档整理.zip

    "barrier_leaflet"可能指的是介绍这些屏障特点、功能和使用方法的小册子或者指南。 【描述】中的信息简洁,"barrier_leaflet pdf文档整理.zip"表明这个压缩包是已经整理过的PDF文档,意味着它们可能已经被分类、...

    why memory barrier

    例如,不恰当的内存屏障使用会降低指令流水线的效率,减少指令级并行处理的机会,降低CPU的利用率,从而影响到系统的整体性能和可扩展性。因此,合理地使用内存屏障,需要开发者有深入的理解,如何在保证数据一致性...

Global site tag (gtag.js) - Google Analytics