Record arrivals at a countdown barrier and report whether it released.

countdown barrier A coordination report can record how many awaited arrivals reached a barrier. A `CountdownEvent` starts with a needed count, and each `Signal` records one arrival without blocking. While arrivals remain below the needed count the barrier is partial, and once enough arrivals have signaled the barrier is released. The status line summarizes whether the barrier stayed waiting, partial, or released after the recorded arrivals.

Countdown Barrier Coordination Report

arrivals
CountdownBarrierCoordinationReport.cs
Replay: real traced execution (multi-file project)
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int arrivals = 2;
        int needed = 3;
        var barrier = new CountdownEvent(needed);
        int signaled = 0;

        for (int i = 0; i < arrivals; i++)
        {
            barrier.Signal();
            signaled++;
        }

        int remaining = barrier.CurrentCount;
        bool released = barrier.IsSet;

        string status;
        if (signaled == 0)
        {
            status = "waiting";
        }
        else if (released)
        {
            status = "released";
        }
        else
        {
            status = "partial";
        }

        Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + " remaining=" + remaining + " " + status);
    }
}
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int arrivals = 0;
        int needed = 3;
        var barrier = new CountdownEvent(needed);
        int signaled = 0;

        for (int i = 0; i < arrivals; i++)
        {
            barrier.Signal();
            signaled++;
        }

        int remaining = barrier.CurrentCount;
        bool released = barrier.IsSet;

        string status;
        if (signaled == 0)
        {
            status = "waiting";
        }
        else if (released)
        {
            status = "released";
        }
        else
        {
            status = "partial";
        }

        Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + " remaining=" + remaining + " " + status);
    }
}
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int arrivals = 3;
        int needed = 3;
        var barrier = new CountdownEvent(needed);
        int signaled = 0;

        for (int i = 0; i < arrivals; i++)
        {
            barrier.Signal();
            signaled++;
        }

        int remaining = barrier.CurrentCount;
        bool released = barrier.IsSet;

        string status;
        if (signaled == 0)
        {
            status = "waiting";
        }
        else if (released)
        {
            status = "released";
        }
        else
        {
            status = "partial";
        }

        Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + " remaining=" + remaining + " " + status);
    }
}
  1. arrivals ← 2, needed ← 3, barrier ← System.Threading.CountdownEvent

    5{6    static void Main()7    {8        int arrivals→ 2 = 2; //@arrivals=0, 39        int needed→ 3 = 3;10        var barrier→ System.Threading.CountdownEvent = new CountdownEvent(needed);11        int signaled→ 0 = 0;
  2. signaled ← 1

    pass 1 of 2
    13for (int i0 = 0; i < arrivals2; i++)14{15    barrierSystem.Threading.CountdownEvent.Signal();16    signaled→ 1++;17}
  3. signaled ← 2

    pass 2 of 2
    13for (int i1 = 0; i < arrivals2; i++)14{15    barrierSystem.Threading.CountdownEvent.Signal();16    signaled→ 2++;17}
  4. remaining ← 1, released ← False

    19int remaining→ 1 = barrier.CurrentCount1;20bool released→ False = barrier.IsSetFalse;2122string status;23if (signaled == 0)
  5. status ← partial

    30}31else32{33    status→ partial = "partial";34}
  6. Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + "…

    36    Console.WriteLine("arrivals=" + arrivals2 + " signaled=" + signaled2 + " remaining=" + remaining1 + " " + statuspartial);37}
    outputarrivals=2 signaled=2 remaining=1 partial
  1. arrivals ← 0, needed ← 3, barrier ← System.Threading.CountdownEvent

    5{6    static void Main()7    {8        int arrivals→ 0 = 0;9        int needed→ 3 = 3;10        var barrier→ System.Threading.CountdownEvent = new CountdownEvent(needed);11        int signaled→ 0 = 0;1213        for (int i = 0; i < arrivals; i++)14        {15            barrier.Signal();16            signaled++;17        }1819        int remaining→ 3 = barrier.CurrentCount3;20        bool released→ False = barrier.IsSetFalse;2122        string status;23        if (signaled == 0)
  2. status ← waiting

    22string status;23if (signaled0 == 0)24{25    status→ waiting = "waiting";26}
  3. Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + "…

    36    Console.WriteLine("arrivals=" + arrivals0 + " signaled=" + signaled0 + " remaining=" + remaining3 + " " + statuswaiting);37}
    outputarrivals=0 signaled=0 remaining=3 waiting
  1. arrivals ← 3, needed ← 3, barrier ← System.Threading.CountdownEvent

    5{6    static void Main()7    {8        int arrivals→ 3 = 3;9        int needed→ 3 = 3;10        var barrier→ System.Threading.CountdownEvent = new CountdownEvent(needed);11        int signaled→ 0 = 0;
  2. signaled ← 1

    pass 1 of 3
    13for (int i0 = 0; i < arrivals3; i++)14{15    barrierSystem.Threading.CountdownEvent.Signal();16    signaled→ 1++;17}
    All 3 passes — pass 1 is the card above
    passisignaled
    100 1
    211 2
    322 3
  3. remaining ← 0, released ← True

    19int remaining→ 0 = barrier.CurrentCount0;20bool released→ True = barrier.IsSetTrue;2122string status;23if (signaled == 0)
  4. status ← released

    26}27else if (releasedTrue)28{29    status→ released = "released";30}
  5. Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + "…

    36    Console.WriteLine("arrivals=" + arrivals3 + " signaled=" + signaled3 + " remaining=" + remaining0 + " " + statusreleased);37}
    outputarrivals=3 signaled=3 remaining=0 released