Barrier Barrier Barrier Barrier Class

定義

複数のタスクが、複数のフェーズを通じて 1 つのアルゴリズムで並行して協調的に動作できるようにします。Enables multiple tasks to cooperatively work on an algorithm in parallel through multiple phases.

public ref class Barrier : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class Barrier : IDisposable
type Barrier = class
    interface IDisposable
Public Class Barrier
Implements IDisposable
継承
BarrierBarrierBarrierBarrier
属性
実装

次の例は、バリアの使用方法を示しています。The following example shows how to use a barrier:

using System;
using System.Threading;
using System.Threading.Tasks;

class BarrierDemo
{
    // Demonstrates:
    //      Barrier constructor with post-phase action
    //      Barrier.AddParticipants()
    //      Barrier.RemoveParticipant()
    //      Barrier.SignalAndWait(), incl. a BarrierPostPhaseException being thrown
    static void BarrierSample()
    {
        int count = 0;

        // Create a barrier with three participants
        // Provide a post-phase action that will print out certain information
        // And the third time through, it will throw an exception
        Barrier barrier = new Barrier(3, (b) =>
        {
            Console.WriteLine("Post-Phase action: count={0}, phase={1}", count, b.CurrentPhaseNumber);
            if (b.CurrentPhaseNumber == 2) throw new Exception("D'oh!");
        });

        // Nope -- changed my mind.  Let's make it five participants.
        barrier.AddParticipants(2);

        // Nope -- let's settle on four participants.
        barrier.RemoveParticipant();


        // This is the logic run by all participants
        Action action = () =>
        {
            Interlocked.Increment(ref count);
            barrier.SignalAndWait(); // during the post-phase action, count should be 4 and phase should be 0
            Interlocked.Increment(ref count);
            barrier.SignalAndWait(); // during the post-phase action, count should be 8 and phase should be 1

            // The third time, SignalAndWait() will throw an exception and all participants will see it
            Interlocked.Increment(ref count);
            try
            {
                barrier.SignalAndWait();
            }
            catch (BarrierPostPhaseException bppe)
            {
                Console.WriteLine("Caught BarrierPostPhaseException: {0}", bppe.Message);
            }

            // The fourth time should be hunky-dory
            Interlocked.Increment(ref count);
            barrier.SignalAndWait(); // during the post-phase action, count should be 16 and phase should be 3
        };

        // Now launch 4 parallel actions to serve as 4 participants
        Parallel.Invoke(action, action, action, action);

        // This (5 participants) would cause an exception:
        // Parallel.Invoke(action, action, action, action, action);
        //      "System.InvalidOperationException: The number of threads using the barrier
        //      exceeded the total number of registered participants."

        // It's good form to Dispose() a barrier when you're done with it.
        barrier.Dispose();

    }

}
Imports System.Threading
Imports System.Threading.Tasks

Module BarrierSample

    ' Demonstrates:
    ' Barrier constructor with post-phase action
    ' Barrier.AddParticipants()
    ' Barrier.RemoveParticipant()
    ' Barrier.SignalAndWait(), incl. a BarrierPostPhaseException being thrown
    Sub Main()
        Dim count As Integer = 0

        ' Create a barrier with three participants
        ' Provide a post-phase action that will print out certain information
        ' And the third time through, it will throw an exception
        Dim barrier As New Barrier(3,
                                   Sub(b)
                                       Console.WriteLine("Post-Phase action: count={0}, phase={1}", count, b.CurrentPhaseNumber)
                                       If b.CurrentPhaseNumber = 2 Then
                                           Throw New Exception("D'oh!")
                                       End If
                                   End Sub)

        ' Nope -- changed my mind. Let's make it five participants.
        barrier.AddParticipants(2)

        ' Nope -- let's settle on four participants.
        barrier.RemoveParticipant()


        ' This is the logic run by all participants
        Dim action As Action =
            Sub()
                Interlocked.Increment(count)
                barrier.SignalAndWait()
                ' during the post-phase action, count should be 4 and phase should be 0

                Interlocked.Increment(count)
                barrier.SignalAndWait()
                ' during the post-phase action, count should be 8 and phase should be 1

                ' The third time, SignalAndWait() will throw an exception and all participants will see it
                Interlocked.Increment(count)
                Try
                    barrier.SignalAndWait()
                Catch bppe As BarrierPostPhaseException
                    Console.WriteLine("Caught BarrierPostPhaseException: {0}", bppe.Message)
                End Try

                ' The fourth time should be hunky-dory
                Interlocked.Increment(count)
                ' during the post-phase action, count should be 16 and phase should be 3
                barrier.SignalAndWait()

            End Sub

        ' Now launch 4 parallel actions to serve as 4 participants
        Parallel.Invoke(action, action, action, action)

        ' This (5 participants) would cause an exception:
        '   Parallel.Invoke(action, action, action, action, action)
        ' "System.InvalidOperationException: The number of threads using the barrier
        ' exceeded the total number of registered participants."

        ' It's good form to Dispose() a barrier when you're done with it.
        barrier.Dispose()
    End Sub
End Module

注釈

タスクのグループは、一連のフェーズを通過することによって連携します。グループ内の各はBarrier 、特定のフェーズのに到着したことを通知し、他のすべてのが到着するまで暗黙的に待機します。A group of tasks cooperate by moving through a series of phases, where each in the group signals it has arrived at the Barrier in a given phase and implicitly waits for all others to arrive. 同じBarrierを複数のフェーズで使用することもできます。The same Barrier can be used for multiple phases.

コンストラクター

Barrier(Int32) Barrier(Int32) Barrier(Int32) Barrier(Int32)

Barrier クラスの新しいインスタンスを初期化します。Initializes a new instance of the Barrier class.

Barrier(Int32, Action<Barrier>) Barrier(Int32, Action<Barrier>) Barrier(Int32, Action<Barrier>) Barrier(Int32, Action<Barrier>)

Barrier クラスの新しいインスタンスを初期化します。Initializes a new instance of the Barrier class.

プロパティ

CurrentPhaseNumber CurrentPhaseNumber CurrentPhaseNumber CurrentPhaseNumber

バリアの現在のフェーズの番号を取得します。Gets the number of the barrier's current phase.

ParticipantCount ParticipantCount ParticipantCount ParticipantCount

バリア内の参加要素の合計数を取得します。Gets the total number of participants in the barrier.

ParticipantsRemaining ParticipantsRemaining ParticipantsRemaining ParticipantsRemaining

現在のフェーズでまだ通知していないバリア内の参加要素の数を取得します。Gets the number of participants in the barrier that haven't yet signaled in the current phase.

メソッド

AddParticipant() AddParticipant() AddParticipant() AddParticipant()

参加要素が 1 つ追加されることを Barrier に通知します。Notifies the Barrier that there will be an additional participant.

AddParticipants(Int32) AddParticipants(Int32) AddParticipants(Int32) AddParticipants(Int32)

複数の参加要素が追加されることを Barrier に通知します。Notifies the Barrier that there will be additional participants.

Dispose() Dispose() Dispose() Dispose()

Barrier クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。Releases all resources used by the current instance of the Barrier class.

Dispose(Boolean) Dispose(Boolean) Dispose(Boolean) Dispose(Boolean)

Barrier が使用しているアンマネージド リソースを解放します。オプションとして、マネージド リソースを解放することもできます。Releases the unmanaged resources used by the Barrier, and optionally releases the managed resources.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
RemoveParticipant() RemoveParticipant() RemoveParticipant() RemoveParticipant()

参加要素が 1 つ削除されることを Barrier に通知します。Notifies the Barrier that there will be one less participant.

RemoveParticipants(Int32) RemoveParticipants(Int32) RemoveParticipants(Int32) RemoveParticipants(Int32)

複数の参加要素が削除されることを Barrier に通知します。Notifies the Barrier that there will be fewer participants.

SignalAndWait() SignalAndWait() SignalAndWait() SignalAndWait()

参加要素がバリアに到達し、他のすべての参加要素もバリアに到達するまで待機することを通知します。Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well.

SignalAndWait(CancellationToken) SignalAndWait(CancellationToken) SignalAndWait(CancellationToken) SignalAndWait(CancellationToken)

取り消しトークンを観察すると同時に、参加要素がバリアに到達し、他のすべての参加要素がバリアに到達するまで待機することを通知します。Signals that a participant has reached the barrier and waits for all other participants to reach the barrier, while observing a cancellation token.

SignalAndWait(Int32) SignalAndWait(Int32) SignalAndWait(Int32) SignalAndWait(Int32)

32 ビット符号付き整数を使用してタイムアウトを計測し、参加要素がバリアに到達し、他のすべての参加要素もバリアに到達するまで待機することを通知します。Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using a 32-bit signed integer to measure the timeout.

SignalAndWait(Int32, CancellationToken) SignalAndWait(Int32, CancellationToken) SignalAndWait(Int32, CancellationToken) SignalAndWait(Int32, CancellationToken)

取り消しトークンを観察すると同時に、32 ビット符号付き整数を使用してタイムアウトを計測し、参加要素がバリアに到達し、他のすべての参加要素もバリアに到達するまで待機することを通知します。Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using a 32-bit signed integer to measure the timeout, while observing a cancellation token.

SignalAndWait(TimeSpan) SignalAndWait(TimeSpan) SignalAndWait(TimeSpan) SignalAndWait(TimeSpan)

TimeSpan オブジェクトを使用して時間間隔を計測し、参加要素がバリアに到達し、他のすべての参加要素もバリアに到達するまで待機することを通知します。Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using a TimeSpan object to measure the time interval.

SignalAndWait(TimeSpan, CancellationToken) SignalAndWait(TimeSpan, CancellationToken) SignalAndWait(TimeSpan, CancellationToken) SignalAndWait(TimeSpan, CancellationToken)

取り消しトークンを観察すると同時に、TimeSpan オブジェクトを使用して時間間隔を計測し、参加要素がバリアに到達し、他のすべての参加要素もバリアに到達するまで待機することを通知します。Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using a TimeSpan object to measure the time interval, while observing a cancellation token.

ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(Inherited from Object)

適用対象

スレッド セーフ

Barrierパブリックメンバーとプロテクトメンバーはすべてスレッドセーフであり、複数のスレッドから同時に使用することができます。 Dispose は例外です。これは、 Barrierの他のすべての操作が完了している場合にのみ使用する必要があります。All public and protected members of Barrier are thread-safe and may be used concurrently from multiple threads, with the exception of Dispose, which must only be used when all other operations on the Barrier have completed.

こちらもご覧ください