Skip to content

Commit 6451356

Browse files
authored
Merge pull request #561 from devlights/add-map-race-example
2 parents c8cfcb0 + 6948f2c commit 6451356

File tree

3 files changed

+134
-0
lines changed

3 files changed

+134
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
version: '3'
2+
3+
tasks:
4+
fmt:
5+
cmds:
6+
- go fmt ./...
7+
vet:
8+
cmds:
9+
- go vet ./...
10+
run:
11+
cmds:
12+
- cmd: for i in {1..10} ; do go run race/main.go; done
13+
silent: true
14+
run-notrace:
15+
cmds:
16+
- cmd: for i in {1..10} ; do go run -race notrace/main.go; done
17+
silent: true
18+
run-with-raceoption:
19+
cmds:
20+
- cmd: go run -race race/main.go
21+
ignore_error: true
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// マップ操作 はスレッドセーフでは無いというのを示すサンプルです。
2+
// 本サンプルはデータ競合が発生しません。
3+
//
4+
// REFERENCES:
5+
// - https://stackoverflow.com/questions/44152988/append-not-thread-safe
6+
// - https://stackoverflow.com/questions/49879322/can-i-concurrently-write-different-slice-elements
7+
package main
8+
9+
import (
10+
"flag"
11+
"fmt"
12+
"strconv"
13+
"sync"
14+
)
15+
16+
func main() {
17+
var (
18+
verbose = flag.Bool("verbose", false, "verbose output")
19+
)
20+
flag.Parse()
21+
22+
var (
23+
mu sync.Mutex
24+
src = make(map[string]bool)
25+
dst = make(map[string]bool)
26+
)
27+
28+
for i := 0; i < 5; i++ {
29+
src[strconv.Itoa(i)] = true
30+
}
31+
32+
wg := sync.WaitGroup{}
33+
for k, v := range src {
34+
wg.Add(1)
35+
go func(k string, v bool) {
36+
defer wg.Done()
37+
38+
mu.Lock()
39+
dst[k] = v
40+
mu.Unlock()
41+
}(k, v)
42+
}
43+
44+
wg.Wait()
45+
46+
fmt.Printf("src-len=%d\tdst-len=%d\n", len(src), len(dst))
47+
48+
if *verbose {
49+
fmt.Println("=========== SRC ===========")
50+
for _, v := range src {
51+
fmt.Println(v)
52+
}
53+
fmt.Println("=========== DST ===========")
54+
for _, v := range dst {
55+
fmt.Println(v)
56+
}
57+
}
58+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// マップ操作 はスレッドセーフでは無いというのを示すサンプルです。
2+
// 本サンプルはデータ競合が発生しています。
3+
//
4+
// REFERENCES:
5+
// - https://stackoverflow.com/questions/44152988/append-not-thread-safe
6+
// - https://stackoverflow.com/questions/49879322/can-i-concurrently-write-different-slice-elements
7+
package main
8+
9+
import (
10+
"flag"
11+
"fmt"
12+
"strconv"
13+
"sync"
14+
)
15+
16+
func main() {
17+
var (
18+
verbose = flag.Bool("verbose", false, "verbose output")
19+
)
20+
flag.Parse()
21+
22+
var (
23+
src = make(map[string]bool)
24+
dst = make(map[string]bool)
25+
)
26+
27+
for i := 0; i < 5; i++ {
28+
src[strconv.Itoa(i)] = true
29+
}
30+
31+
wg := sync.WaitGroup{}
32+
for k, v := range src {
33+
wg.Add(1)
34+
go func(k string, v bool) {
35+
defer wg.Done()
36+
37+
dst[k] = v
38+
}(k, v)
39+
}
40+
41+
wg.Wait()
42+
43+
fmt.Printf("src-len=%d\tdst-len=%d\n", len(src), len(dst))
44+
45+
if *verbose {
46+
fmt.Println("=========== SRC ===========")
47+
for _, v := range src {
48+
fmt.Println(v)
49+
}
50+
fmt.Println("=========== DST ===========")
51+
for _, v := range dst {
52+
fmt.Println(v)
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)