Concurrency Coordination Reports
Semaphore Guard Coordination Report
Record nonblocking guard acquisitions and report whether a later attempt was blocked.
nonblocking acquire
A coordination report records nonblocking acquire attempts. A `SemaphoreSlim` created with one permit acts as an exclusive guard, and `Wait(0)` returns true when it takes the permit and false when the permit is already held, so it never blocks. The first acquire takes the only permit, so a later attempt in the same run is reported as blocked and the status line summarizes whether the section stayed idle, guarded, or blocked a later acquire.
Semaphore Guard Coordination Report
SemaphoreGuardCoordinationReport.cs
Replay: real traced execution (multi-file project)
using System;
using System.Threading;
class Program
{
static void Main()
{
int holds = 1;
var guard = new SemaphoreSlim(1, 1);
int acquired = 0;
int blocked = 0;
for (int i = 0; i < holds; i++)
{
if (guard.Wait(0))
{
acquired++;
}
else
{
blocked++;
}
}
string status;
if (acquired == 0)
{
status = "idle";
}
else if (blocked > 0)
{
status = "blocked";
}
else
{
status = "guarded";
}
Console.WriteLine("holds=" + holds + " acquired=" + acquired + " blocked=" + blocked + " " + status);
}
}
using System;
using System.Threading;
class Program
{
static void Main()
{
int holds = 0;
var guard = new SemaphoreSlim(1, 1);
int acquired = 0;
int blocked = 0;
for (int i = 0; i < holds; i++)
{
if (guard.Wait(0))
{
acquired++;
}
else
{
blocked++;
}
}
string status;
if (acquired == 0)
{
status = "idle";
}
else if (blocked > 0)
{
status = "blocked";
}
else
{
status = "guarded";
}
Console.WriteLine("holds=" + holds + " acquired=" + acquired + " blocked=" + blocked + " " + status);
}
}
using System;
using System.Threading;
class Program
{
static void Main()
{
int holds = 2;
var guard = new SemaphoreSlim(1, 1);
int acquired = 0;
int blocked = 0;
for (int i = 0; i < holds; i++)
{
if (guard.Wait(0))
{
acquired++;
}
else
{
blocked++;
}
}
string status;
if (acquired == 0)
{
status = "idle";
}
else if (blocked > 0)
{
status = "blocked";
}
else
{
status = "guarded";
}
Console.WriteLine("holds=" + holds + " acquired=" + acquired + " blocked=" + blocked + " " + status);
}
}
holds ← 1, guard ← System.Threading.SemaphoreSlim, acquired ← 0
5{6 static void Main()7 {8 int holds→ 1 = 1; //@holds=0, 29 var guard→ System.Threading.SemaphoreSlim = new SemaphoreSlim(1, 1);10 int acquired→ 0 = 0;11 int blocked→ 0 = 0;for (int i = 0; i < holds; i++)
13for (int i0 = 0; i < holds1; i++)14{15 if (guard.Wait(0))acquired ← 1
14{15 if (guardSystem.Threading.SemaphoreSlim.Wait(0))16 {17 acquired→ 1++;18 }string status;
25string status;26if (acquired == 0)status ← guarded
33}34else35{36 status→ guarded = "guarded";37}Console.WriteLine("holds=" + holds + " acquired=" + acquired + " block…
39 Console.WriteLine("holds=" + holds1 + " acquired=" + acquired1 + " blocked=" + blocked0 + " " + statusguarded);40}outputholds=1 acquired=1 blocked=0 guarded
holds ← 0, guard ← System.Threading.SemaphoreSlim, acquired ← 0
5{6 static void Main()7 {8 int holds→ 0 = 0;9 var guard→ System.Threading.SemaphoreSlim = new SemaphoreSlim(1, 1);10 int acquired→ 0 = 0;11 int blocked→ 0 = 0;1213 for (int i = 0; i < holds; i++)14 {15 if (guard.Wait(0))16 {17 acquired++;18 }19 else20 {21 blocked++;22 }23 }2425 string status;26 if (acquired == 0)status ← idle
25string status;26if (acquired0 == 0)27{28 status→ idle = "idle";29}Console.WriteLine("holds=" + holds + " acquired=" + acquired + " block…
39 Console.WriteLine("holds=" + holds0 + " acquired=" + acquired0 + " blocked=" + blocked0 + " " + statusidle);40}outputholds=0 acquired=0 blocked=0 idle
holds ← 2, guard ← System.Threading.SemaphoreSlim, acquired ← 0
5{6 static void Main()7 {8 int holds→ 2 = 2;9 var guard→ System.Threading.SemaphoreSlim = new SemaphoreSlim(1, 1);10 int acquired→ 0 = 0;11 int blocked→ 0 = 0;for (int i = 0; i < holds; i++)
pass 1 of 213for (int i0 = 0; i < holds2; i++)14{15 if (guard.Wait(0))acquired ← 1
14{15 if (guardSystem.Threading.SemaphoreSlim.Wait(0))16 {17 acquired→ 1++;18 }for (int i = 0; i < holds; i++)
pass 2 of 213for (int i1 = 0; i < holds2; i++)14{15 if (guard.Wait(0))blocked ← 1
18}19else20{21 blocked→ 1++;22}string status;
25string status;26if (acquired == 0)status ← blocked
29}30else if (blocked1 > 0)31{32 status→ blocked = "blocked";33}Console.WriteLine("holds=" + holds + " acquired=" + acquired + " block…
39 Console.WriteLine("holds=" + holds2 + " acquired=" + acquired1 + " blocked=" + blocked1 + " " + statusblocked);40}outputholds=2 acquired=1 blocked=1 blocked