File tree Expand file tree Collapse file tree 3 files changed +134
-0
lines changed
examples/singleapp/map_is_not_threadsafe Expand file tree Collapse file tree 3 files changed +134
-0
lines changed Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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\t dst-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+ }
Original file line number Diff line number Diff line change 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\t dst-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+ }
You can’t perform that action at this time.
0 commit comments