When I use the following test code, some threads will loop. But we added println() os.Creat () or os.Open (), this will not happen。
var casValue = new(int64)
*casValue = 0
var old int64 = 0
var new int64 = 1
var container *list.List
container = list.New()
var wg sync.WaitGroup
wg.Add(10)
t1 := time.Now()
for i := 0; i < 10; i++ {
go func(i int) {
for j := 0; j < 10000; {
if atomic.CompareAndSwapInt64(casValue, old, new) {
var test = "hello world,hello world,hello world"
container.PushBack(test)
*casValue = 0
j++
}
//println("hello")、os.Create("test")、os.Open("test") will solve this problem
}
println("casValue=", *casValue)
wg.Done()
}(i)
}
lentcy := time.Since(t1)
wg.Wait()
fmt.Println(container.Len())
package main
import (
"container/list"
"fmt"
"sync"
"sync/atomic"
"time"
)
func main() {
var casValue = new(int64)
*casValue = 0
var old int64 = 0
var new int64 = 1
var container *list.List
container = list.New()
var wg sync.WaitGroup
wg.Add(10)
t1 := time.Now()
for i := 0; i < 10; i++ {
go func(i int) {
for j := 0; j < 10000; {
if atomic.CompareAndSwapInt64(casValue, old, new) {
var test = "hello world,hello world,hello world"
container.PushBack(test)
*casValue = 0
j++
}
//println("hello")、os.Create("test")、os.Open("test") will solve this problem
}
println("casValue=", *casValue)
wg.Done()
}(i)
}
wg.Wait()
latency := time.Since(t1)
fmt.Println(latency)
fmt.Println(container.Len())
}
.
$ go run -race racer.go
==================
WARNING: DATA RACE
Write at 0x00c00013a010 by goroutine 8:
sync/atomic.CompareAndSwapInt64()
/home/peter/go/src/runtime/race_amd64.s:327 +0xb
main.main.func1()
/home/peter/Sync/gopath/mod/gf/racer.go:25 +0x84
Previous write at 0x00c00013a010 by goroutine 7:
main.main.func1()
/home/peter/Sync/gopath/mod/gf/racer.go:28 +0x312
Goroutine 8 (running) created at:
main.main()
/home/peter/Sync/gopath/mod/gf/racer.go:23 +0x23d
Goroutine 7 (running) created at:
main.main()
/home/peter/Sync/gopath/mod/gf/racer.go:23 +0x23d
==================
==================
WARNING: DATA RACE
Read at 0x00c000124158 by goroutine 9:
container/list.(*List).PushBack()
/home/peter/go/src/container/list/list.go:155 +0x104
main.main.func1()
/home/peter/Sync/gopath/mod/gf/racer.go:27 +0x93
Previous write at 0x00c000124158 by goroutine 7:
container/list.(*List).insert()
/home/peter/go/src/container/list/list.go:96 +0x27c
container/list.(*List).insertValue()
/home/peter/go/src/container/list/list.go:104 +0x113
container/list.(*List).PushBack()
/home/peter/go/src/container/list/list.go:155 +0xf5
main.main.func1()
/home/peter/Sync/gopath/mod/gf/racer.go:27 +0x93
Goroutine 9 (running) created at:
main.main()
/home/peter/Sync/gopath/mod/gf/racer.go:23 +0x23d
Goroutine 7 (running) created at:
main.main()
/home/peter/Sync/gopath/mod/gf/racer.go:23 +0x23d
==================
<SNIP>