Home | History | Annotate | Download | only in testprog
      1 // Copyright 2016 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package main
      6 
      7 import "runtime"
      8 
      9 func init() {
     10 	register("concurrentMapWrites", concurrentMapWrites)
     11 	register("concurrentMapReadWrite", concurrentMapReadWrite)
     12 	register("concurrentMapIterateWrite", concurrentMapIterateWrite)
     13 }
     14 
     15 func concurrentMapWrites() {
     16 	m := map[int]int{}
     17 	c := make(chan struct{})
     18 	go func() {
     19 		for i := 0; i < 10000; i++ {
     20 			m[5] = 0
     21 			runtime.Gosched()
     22 		}
     23 		c <- struct{}{}
     24 	}()
     25 	go func() {
     26 		for i := 0; i < 10000; i++ {
     27 			m[6] = 0
     28 			runtime.Gosched()
     29 		}
     30 		c <- struct{}{}
     31 	}()
     32 	<-c
     33 	<-c
     34 }
     35 
     36 func concurrentMapReadWrite() {
     37 	m := map[int]int{}
     38 	c := make(chan struct{})
     39 	go func() {
     40 		for i := 0; i < 10000; i++ {
     41 			m[5] = 0
     42 			runtime.Gosched()
     43 		}
     44 		c <- struct{}{}
     45 	}()
     46 	go func() {
     47 		for i := 0; i < 10000; i++ {
     48 			_ = m[6]
     49 			runtime.Gosched()
     50 		}
     51 		c <- struct{}{}
     52 	}()
     53 	<-c
     54 	<-c
     55 }
     56 
     57 func concurrentMapIterateWrite() {
     58 	m := map[int]int{}
     59 	c := make(chan struct{})
     60 	go func() {
     61 		for i := 0; i < 10000; i++ {
     62 			m[5] = 0
     63 			runtime.Gosched()
     64 		}
     65 		c <- struct{}{}
     66 	}()
     67 	go func() {
     68 		for i := 0; i < 10000; i++ {
     69 			for range m {
     70 			}
     71 			runtime.Gosched()
     72 		}
     73 		c <- struct{}{}
     74 	}()
     75 	<-c
     76 	<-c
     77 }
     78