Concurrency and Source Panels
Thread Result Slots
Run two named thread methods and collect their results in stable slots.
thread
Threads may finish in either order, so shared examples should write to stable positions before the main thread joins and reads them.
Thread Result Slots
ThreadResultSlots.cs
Replay: real traced execution (multi-file project)
using System;
using System.Threading;
class Program
{
static int baseScore;
static int leftResult;
static int rightResult;
static void LeftWorker()
{
int adjusted = baseScore + 2;
leftResult = adjusted;
}
static void RightWorker()
{
int adjusted = baseScore * 2;
rightResult = adjusted;
}
static void Main()
{
int seed = 10;
baseScore = seed;
Thread left = new Thread(LeftWorker);
Thread right = new Thread(RightWorker);
left.Start();
right.Start();
left.Join();
right.Join();
int total = leftResult + rightResult;
Console.WriteLine($"seed={seed}");
Console.WriteLine($"total={total}");
}
}
using System;
using System.Threading;
class Program
{
static int baseScore;
static int leftResult;
static int rightResult;
static void LeftWorker()
{
int adjusted = baseScore + 2;
leftResult = adjusted;
}
static void RightWorker()
{
int adjusted = baseScore * 2;
rightResult = adjusted;
}
static void Main()
{
int seed = 4;
baseScore = seed;
Thread left = new Thread(LeftWorker);
Thread right = new Thread(RightWorker);
left.Start();
right.Start();
left.Join();
right.Join();
int total = leftResult + rightResult;
Console.WriteLine($"seed={seed}");
Console.WriteLine($"total={total}");
}
}
using System;
using System.Threading;
class Program
{
static int baseScore;
static int leftResult;
static int rightResult;
static void LeftWorker()
{
int adjusted = baseScore + 2;
leftResult = adjusted;
}
static void RightWorker()
{
int adjusted = baseScore * 2;
rightResult = adjusted;
}
static void Main()
{
int seed = 20;
baseScore = seed;
Thread left = new Thread(LeftWorker);
Thread right = new Thread(RightWorker);
left.Start();
right.Start();
left.Join();
right.Join();
int total = leftResult + rightResult;
Console.WriteLine($"seed={seed}");
Console.WriteLine($"total={total}");
}
}
seed ← 10, baseScore ← 10, left ← System.Threading.Thread, right ← System.Threading.Thread
22static void Main()23{24 int seed→ 10 = 10; //@seed=4, 2025 baseScore→ 10 = seed10;2627 Thread left→ System.Threading.Thread = new Thread(LeftWorker);28 Thread right→ System.Threading.Thread = new Thread(RightWorker);2930 leftSystem.Threading.Thread.Start();31 rightSystem.Threading.Thread.Start();adjusted ← 12, leftResult ← 12
10static void LeftWorker()11{12 int adjusted→ 12 = baseScore10 + 2;13 leftResult→ 12 = adjusted12;14}adjusted ← 20, rightResult ← 20
16static void RightWorker()17{18 int adjusted→ 20 = baseScore10 * 2;19 rightResult→ 20 = adjusted20;20}total ← 32
30 left.Start();31 rightSystem.Threading.Thread.Start();3233 leftSystem.Threading.Thread.Join();34 rightSystem.Threading.Thread.Join();3536 int total→ 32 = leftResult12 + rightResult20;37 Console.WriteLine($"seed={seed10}");38 Console.WriteLine($"total={total32}");39}outputseed=10 total=32
seed ← 4, baseScore ← 4, left ← System.Threading.Thread, right ← System.Threading.Thread
22static void Main()23{24 int seed→ 4 = 4;25 baseScore→ 4 = seed4;2627 Thread left→ System.Threading.Thread = new Thread(LeftWorker);28 Thread right→ System.Threading.Thread = new Thread(RightWorker);2930 leftSystem.Threading.Thread.Start();31 rightSystem.Threading.Thread.Start();adjusted ← 6, leftResult ← 6
10static void LeftWorker()11{12 int adjusted→ 6 = baseScore4 + 2;13 leftResult→ 6 = adjusted6;14}adjusted ← 8, rightResult ← 8
16static void RightWorker()17{18 int adjusted→ 8 = baseScore4 * 2;19 rightResult→ 8 = adjusted8;20}total ← 14
30 left.Start();31 rightSystem.Threading.Thread.Start();3233 leftSystem.Threading.Thread.Join();34 rightSystem.Threading.Thread.Join();3536 int total→ 14 = leftResult6 + rightResult8;37 Console.WriteLine($"seed={seed4}");38 Console.WriteLine($"total={total14}");39}outputseed=4 total=14
seed ← 20, baseScore ← 20, left ← System.Threading.Thread, right ← System.Threading.Thread
22static void Main()23{24 int seed→ 20 = 20;25 baseScore→ 20 = seed20;2627 Thread left→ System.Threading.Thread = new Thread(LeftWorker);28 Thread right→ System.Threading.Thread = new Thread(RightWorker);2930 leftSystem.Threading.Thread.Start();31 rightSystem.Threading.Thread.Start();3233 leftSystem.Threading.Thread.Join();34 right.Join();adjusted ← 40, rightResult ← 40
16static void RightWorker()17{18 int adjusted→ 40 = baseScore20 * 2;19 rightResult→ 40 = adjusted40;20}adjusted ← 22, leftResult ← 22
10static void LeftWorker()11{12 int adjusted→ 22 = baseScore20 + 2;13 leftResult→ 22 = adjusted22;14}total ← 62
33 leftSystem.Threading.Thread.Join();34 rightSystem.Threading.Thread.Join();3536 int total→ 62 = leftResult22 + rightResult40;37 Console.WriteLine($"seed={seed20}");38 Console.WriteLine($"total={total62}");39}outputseed=20 total=62