Aracılığıyla paylaş


Engel

A System.Threading.Barrier , birden çok iş parçacığının ( katılımcı olarak bilinir) aşamalar halinde bir algoritma üzerinde eşzamanlı olarak çalışmasını sağlayan bir eşitleme temel bilgisidir. Her katılımcı, koddaki bariyer noktasına ulaşana kadar kendi işlemini yürütür. Bariyer, bir çalışma aşamasının sonunu temsil eder. Bir katılımcı bariyere ulaştığında, tüm katılımcılar aynı engele ulaşana kadar engeller. Tüm katılımcılar engele ulaştıktan sonra isteğe bağlı olarak bir aşama sonrası eylemi çağırabilirsiniz. Bu faz sonrası işlem, diğer tüm iş parçacıkları hala engellenmiş durumdayken tek iş parçacığının işlem yapmasını sağlamak için kullanılabilir. Eylem yürütüldükten sonra katılımcıların engeli kaldırılır.

Aşağıdaki kod parçacığında temel bir engel deseni gösterilmektedir.


// Create the Barrier object, and supply a post-phase delegate
// to be invoked at the end of each phase.
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;
    });

// Define the work that each thread will perform. (Threads do not
// have to all execute the same method.)
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)
    {
        // Begin phase:
        // Process data here on each thread, and optionally
        // store results, for example:
        results[partitionNum] = ProcessData(data[partitionNum]);

        // End phase:
        // After all threads arrive,post-phase delegate
        // is invoked, then threads are unblocked. Overloads
        // accept a timeout value and/or CancellationToken.
        barrier.SignalAndWait();
    }
}

// Perform n tasks to run in parallel. For simplicity
// all threads execute the same method in this example.
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();
}

' Create the Barrier object, and supply a post-phase delegate 
' to be invoked at the end of each phase.
Dim barrier = New Barrier(2, Sub(bar)
                                 ' Examine results from all threads, determine 
                                 ' whether to continue, create inputs for next phase, etc. 
                                 If (someCondition) Then
                                     success = True
                                 End If
                             End Sub)



' Define the work that each thread will perform. (Threads do not
' have to all execute the same method.)
Sub CrunchNumbers(ByVal partitionNum As Integer)

    ' Up to System.Int64.MaxValue phases are supported. We assume
    ' in this code that the problem will be solved before that.
    While (success = False)

        ' Begin phase:
        ' Process data here on each thread, and optionally
        ' store results, for example:
        results(partitionNum) = ProcessData(myData(partitionNum))

        ' End phase:
        ' After all threads arrive,post-phase delegate
        ' is invoked, then threads are unblocked. Overloads
        ' accept a timeout value and/or CancellationToken.
        barrier.SignalAndWait()
    End While
End Sub

' Perform n tasks to run in parallel. For simplicity
' all threads execute the same method in this example.
Shared Sub Main()

    Dim app = New BarrierDemo()
    Dim t1 = New Thread(Sub() app.CrunchNumbers(0))
    Dim t2 = New Thread(Sub() app.CrunchNumbers(1))
    t1.Start()
    t2.Start()
End Sub

Tam bir örnek için bkz . Nasıl yapılır: Eş zamanlı işlemleri bir Engel ile eşitleme.

Katılımcı ekleme ve kaldırma

Örnek Barrier oluşturduğunuzda katılımcı sayısını belirtin. Ayrıca istediğiniz zaman katılımcıları dinamik olarak ekleyebilir veya kaldırabilirsiniz. Örneğin, bir katılımcı sorunun onunla ilgili kısmını çözerse, sonucu depolayabilir, bu iş parçacığında yürütmeyi durdurabilir ve engeldeki katılımcı sayısını azaltmak için Barrier.RemoveParticipant çağrısını yapabilirsiniz. çağırarak Barrier.AddParticipantbir katılımcı eklediğinizde, dönüş değeri geçerli aşama numarasını belirtir; bu, yeni katılımcının çalışmasını başlatmak için yararlı olabilir.

Engelleri aştı

Bir katılımcı engele ulaşamazsa kilitlenmeler oluşabilir. Bu kilitlenmeleri önlemek için, Barrier.SignalAndWait yönteminin aşırı yüklemelerini kullanarak zaman aşımı süresini ve iptal belirtecini belirtin. Bu aşırı yüklemeler, bir sonraki aşamaya geçmeden önce her katılımcının denetleyebileceği bir Boole değeri döndürür.

Aşama sonrası özel durumlar

Post aşaması temsilcisi bir istisna oluşturursa, istisna bir BarrierPostPhaseException nesnesine sarmalanır ve tüm katılımcılara iletilir.

Bariyer ve ContinueWhenAll karşılaştırması

Özellikle iş parçacıkları döngülerde birden fazla aşamayı gerçekleştirdiğinde engeller yararlıdır. Kodunuz yalnızca bir veya iki çalışma aşaması gerektiriyorsa, aşağıdakiler de dahil olmak üzere herhangi bir örtük birleşime sahip nesnelerin kullanılıp kullanılmayacağını System.Threading.Tasks.Task göz önünde bulundurun:

Daha fazla bilgi için bkz. Devamlılık Görevlerini Kullanarak Görevleri Zincirleme.

Ayrıca bakınız