github.com/hlts2/go@v0.0.0-20170904000733-812b34efaed8/src/runtime/race/sched_test.go (about) 1 // Copyright 2015 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 // +build race 6 7 package race_test 8 9 import ( 10 "bytes" 11 "fmt" 12 "reflect" 13 "runtime" 14 "testing" 15 ) 16 17 func TestRandomScheduling(t *testing.T) { 18 // Scheduler is most consistent with GOMAXPROCS=1. 19 // Use that to make the test most likely to fail. 20 defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) 21 const N = 10 22 out := make([][]int, N) 23 for i := 0; i < N; i++ { 24 c := make(chan int, N) 25 for j := 0; j < N; j++ { 26 go func(j int) { 27 c <- j 28 }(j) 29 } 30 row := make([]int, N) 31 for j := 0; j < N; j++ { 32 row[j] = <-c 33 } 34 out[i] = row 35 } 36 37 for i := 0; i < N; i++ { 38 if !reflect.DeepEqual(out[0], out[i]) { 39 return // found a different order 40 } 41 } 42 43 var buf bytes.Buffer 44 for i := 0; i < N; i++ { 45 fmt.Fprintf(&buf, "%v\n", out[i]) 46 } 47 t.Fatalf("consistent goroutine execution order:\n%v", buf.String()) 48 }