Concurrency Coordination Reports
Countdown Barrier Coordination Report
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
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);
}
}
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;signaled ← 1
pass 1 of 213for (int i0 = 0; i < arrivals2; i++)14{15 barrierSystem.Threading.CountdownEvent.Signal();16 signaled→ 1++;17}signaled ← 2
pass 2 of 213for (int i1 = 0; i < arrivals2; i++)14{15 barrierSystem.Threading.CountdownEvent.Signal();16 signaled→ 2++;17}remaining ← 1, released ← False
19int remaining→ 1 = barrier.CurrentCount1;20bool released→ False = barrier.IsSetFalse;2122string status;23if (signaled == 0)status ← partial
30}31else32{33 status→ partial = "partial";34}Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + "…
36 Console.WriteLine("arrivals=" + arrivals2 + " signaled=" + signaled2 + " remaining=" + remaining1 + " " + statuspartial);37}outputarrivals=2 signaled=2 remaining=1 partial
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)status ← waiting
22string status;23if (signaled0 == 0)24{25 status→ waiting = "waiting";26}Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + "…
36 Console.WriteLine("arrivals=" + arrivals0 + " signaled=" + signaled0 + " remaining=" + remaining3 + " " + statuswaiting);37}outputarrivals=0 signaled=0 remaining=3 waiting
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;signaled ← 1
pass 1 of 313for (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 pass isignaled1 0 0 → 1 2 1 1 → 2 3 2 2 → 3 remaining ← 0, released ← True
19int remaining→ 0 = barrier.CurrentCount0;20bool released→ True = barrier.IsSetTrue;2122string status;23if (signaled == 0)status ← released
26}27else if (releasedTrue)28{29 status→ released = "released";30}Console.WriteLine("arrivals=" + arrivals + " signaled=" + signaled + "…
36 Console.WriteLine("arrivals=" + arrivals3 + " signaled=" + signaled3 + " remaining=" + remaining0 + " " + statusreleased);37}outputarrivals=3 signaled=3 remaining=0 released