Concurrency Coordination Reports
Thread Value Coordination Report
Run a bounded worker thread, collect its return value, and report a size label for the settled result.
thread value
`Thread#value` joins a worker and returns the value of its block, so reading the settled result reports the finished state without leaving a background thread running.
Thread Value Coordination Report
thread_value_coordination_report.rb
Replay: real traced execution (multi-file project)
seed = 3
worker = Thread.new do
total = 0
seed.times do |step|
total += step + 1
end
total
end
result = worker.value
finished = worker.status == false
status = if result <= 3
"small"
elsif result <= 12
"mid"
else
"large"
end
puts "seed=#{seed}"
puts "finished=#{finished}"
puts "result=#{result}"
puts "status=#{status}"
seed = 1
worker = Thread.new do
total = 0
seed.times do |step|
total += step + 1
end
total
end
result = worker.value
finished = worker.status == false
status = if result <= 3
"small"
elsif result <= 12
"mid"
else
"large"
end
puts "seed=#{seed}"
puts "finished=#{finished}"
puts "result=#{result}"
puts "status=#{status}"
seed = 6
worker = Thread.new do
total = 0
seed.times do |step|
total += step + 1
end
total
end
result = worker.value
finished = worker.status == false
status = if result <= 3
"small"
elsif result <= 12
"mid"
else
"large"
end
puts "seed=#{seed}"
puts "finished=#{finished}"
puts "result=#{result}"
puts "status=#{status}"
seed ← 3, worker ← ⟨Thread A /tmp/execution/⟨tmp B⟩.rb:32 run⟩
1seed→ 3 = 3 #@seed=1, 62worker→ ⟨Thread A /tmp/execution/⟨tmp B⟩.rb:32 run⟩ = Thread.new do3 total = 04 seed.times do |step|5 total += step + 16 end7 total8endtotal ← 0
1seed = 3 #@seed=1, 62worker = Thread.new do3 total→ 0 = 04 seed3.times do |step|5 total += step + 16 end7 total08enddo |step|
pass 1 of 33total = 04seed.times do |step0|5 total0 += step0 + 16endAll 3 passes — pass 1 is the card above pass steptotal1 0 0 2 1 1 3 2 3 result ← 6, finished ← true, status ← mid
10result→ 6 = worker.value611finished→ true = worker.statusfalse == false1213status→ mid = if result6 <= 314 "small"15elsif result6 <= 1216 "mid"17else18 "large"19end2021puts "seed=#{seed3}"22puts "finished=#{finishedtrue}"23puts "result=#{result6}"24puts "status=#{statusmid}"outputseed=3 finished=true result=6 status=mid
seed ← 1, worker ← ⟨Thread A /tmp/execution/⟨tmp B⟩.rb:32 run⟩
1seed→ 1 = 12worker→ ⟨Thread A /tmp/execution/⟨tmp B⟩.rb:32 run⟩ = Thread.new do3 total = 04 seed.times do |step|5 total += step + 16 end7 total8endtotal ← 0
1seed = 12worker = Thread.new do3 total→ 0 = 04 seed1.times do |step|5 total += step + 16 end7 total08enddo |step|
3total = 04seed.times do |step0|5 total0 += step0 + 16endresult ← 1, finished ← true, status ← small
10result→ 1 = worker.value111finished→ true = worker.statusfalse == false1213status→ small = if result1 <= 314 "small"15elsif result1 <= 1216 "mid"17else18 "large"19end2021puts "seed=#{seed1}"22puts "finished=#{finishedtrue}"23puts "result=#{result1}"24puts "status=#{statussmall}"outputseed=1 finished=true result=1 status=small
seed ← 6, worker ← ⟨Thread A /tmp/execution/⟨tmp B⟩.rb:32 run⟩
1seed→ 6 = 62worker→ ⟨Thread A /tmp/execution/⟨tmp B⟩.rb:32 run⟩ = Thread.new do3 total = 04 seed.times do |step|5 total += step + 16 end7 total8endtotal ← 0
1seed = 62worker = Thread.new do3 total→ 0 = 04 seed6.times do |step|5 total += step + 16 end7 total08enddo |step|
pass 1 of 63total = 04seed.times do |step0|5 total0 += step0 + 16endAll 6 passes — pass 1 is the card above pass steptotal1 0 0 2 1 1 3 2 3 4 3 6 5 4 10 6 5 15 result ← 21, finished ← true, status ← large
10result→ 21 = worker.value2111finished→ true = worker.statusfalse == false1213status→ large = if result21 <= 314 "small"15elsif result21 <= 1216 "mid"17else18 "large"19end2021puts "seed=#{seed6}"22puts "finished=#{finishedtrue}"23puts "result=#{result21}"24puts "status=#{statuslarge}"outputseed=6 finished=true result=21 status=large