Concurrency Coordination Reports
Once-Do Coordination Report
Record write-once initialization and report accepted versus skipped runs.
write-once cell
`sync.Once.Do` runs its function exactly once across every call, so the first offered write is accepted and stores its value while every later write is skipped. The accepted and skipped counts report whether the cell stayed unset, was set once, or locked out a later write, and the stored value shows what the first accepted write left behind.
Once-Do Coordination Report
once_do_coordination_report.go
Replay: real traced execution (multi-file project)
package main
import (
"fmt"
"sync"
)
func main() {
var writes = 2
var once sync.Once
accepted := 0
skipped := 0
stored := 0
for value := 1; value <= writes; value++ {
ran := false
once.Do(func() {
ran = true
stored = value
})
if ran {
accepted++
} else {
skipped++
}
}
var status string
if accepted == 0 {
status = "unset"
} else if skipped > 0 {
status = "locked"
} else {
status = "set"
}
fmt.Printf("accepted=%d skipped=%d stored=%d %s\n", accepted, skipped, stored, status)
}
package main
import (
"fmt"
"sync"
)
func main() {
var writes = 0
var once sync.Once
accepted := 0
skipped := 0
stored := 0
for value := 1; value <= writes; value++ {
ran := false
once.Do(func() {
ran = true
stored = value
})
if ran {
accepted++
} else {
skipped++
}
}
var status string
if accepted == 0 {
status = "unset"
} else if skipped > 0 {
status = "locked"
} else {
status = "set"
}
fmt.Printf("accepted=%d skipped=%d stored=%d %s\n", accepted, skipped, stored, status)
}
package main
import (
"fmt"
"sync"
)
func main() {
var writes = 1
var once sync.Once
accepted := 0
skipped := 0
stored := 0
for value := 1; value <= writes; value++ {
ran := false
once.Do(func() {
ran = true
stored = value
})
if ran {
accepted++
} else {
skipped++
}
}
var status string
if accepted == 0 {
status = "unset"
} else if skipped > 0 {
status = "locked"
} else {
status = "set"
}
fmt.Printf("accepted=%d skipped=%d stored=%d %s\n", accepted, skipped, stored, status)
}
writes ← 2, once ← sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}}
8func main() {9 var writes→ 2 = 2 //@writes=0, 110 var once→ sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}} sync.Once11 accepted→ 0 := 012 skipped→ 0 := 013 stored→ 0 := 014 for value := 1; value <= writes; value++ {ran ← false
pass 1 of 213stored := 014for value1 := 1; value <= writes2; value++ {15 ran→ false := false16 oncesync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}}.Do(func() {17 ran = true18 stored = value19 })20 if ran {ran ← true, stored ← 1, once ← sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x1}, m:sync.Mutex{state:0, sema:0x0}}
15ran := false16once→ sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x1}, m:sync.Mutex{state:0, sema:0x0}}.Do(func() {17 ran→ true = true18 stored→ 1 = value119})20if ran {accepted ← 1
19})20if rantrue {21 accepted→ 1++22} else {ran ← false
pass 2 of 213stored := 014for value2 := 1; value <= writes2; value++ {15 ran→ false := false16 oncesync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x1}, m:sync.Mutex{state:0, sema:0x0}}.Do(func() {17 ran = true18 stored = value19 })20 if ran {skipped ← 1
21 accepted++22} else {23 skipped→ 1++24}status ← ""
25}26var status→ "" string27if accepted == 0 {status ← "locked"
28 status = "unset"29} else if skipped1 > 0 {30 status→ "locked" = "locked"31} else {fmt.Printf("accepted=%d skipped=%d stored=%d %s ", accepted, skipped, …
33 }34 fmt.Printf("accepted=%d skipped=%d stored=%d %s\n", accepted1, skipped1, stored1, status"locked")35}outputaccepted=1 skipped=1 stored=1 locked
writes ← 0, once ← sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}}
8func main() {9 var writes→ 0 = 010 var once→ sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}} sync.Once11 accepted→ 0 := 012 skipped→ 0 := 013 stored→ 0 := 014 for value := 1; value <= writes; value++ {15 ran := false16 once.Do(func() {17 ran = true18 stored = value19 })20 if ran {21 accepted++22 } else {23 skipped++24 }25 }26 var status→ "" string27 if accepted == 0 {status ← "unset"
26var status string27if accepted0 == 0 {28 status→ "unset" = "unset"29} else if skipped > 0 {fmt.Printf("accepted=%d skipped=%d stored=%d %s ", accepted, skipped, …
33 }34 fmt.Printf("accepted=%d skipped=%d stored=%d %s\n", accepted0, skipped0, stored0, status"unset")35}outputaccepted=0 skipped=0 stored=0 unset
writes ← 1, once ← sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}}
8func main() {9 var writes→ 1 = 110 var once→ sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}} sync.Once11 accepted→ 0 := 012 skipped→ 0 := 013 stored→ 0 := 014 for value := 1; value <= writes; value++ {ran ← false
13stored := 014for value1 := 1; value <= writes1; value++ {15 ran→ false := false16 oncesync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x0}, m:sync.Mutex{state:0, sema:0x0}}.Do(func() {17 ran = true18 stored = value19 })20 if ran {ran ← true, stored ← 1, once ← sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x1}, m:sync.Mutex{state:0, sema:0x0}}
15ran := false16once→ sync.Once{done:atomic.Uint32{_:atomic.noCopy{}, v:0x1}, m:sync.Mutex{state:0, sema:0x0}}.Do(func() {17 ran→ true = true18 stored→ 1 = value119})20if ran {accepted ← 1
19})20if rantrue {21 accepted→ 1++22} else {status ← ""
25}26var status→ "" string27if accepted == 0 {status ← "set"
30 status = "locked"31} else {32 status→ "set" = "set"33}fmt.Printf("accepted=%d skipped=%d stored=%d %s ", accepted, skipped, …
33 }34 fmt.Printf("accepted=%d skipped=%d stored=%d %s\n", accepted1, skipped0, stored1, status"set")35}outputaccepted=1 skipped=0 stored=1 set