github.com/stingnevermore/go@v0.0.0-20180120041312-3810f5bfed72/test/ken/chan1.go (about)

     1  // run
     2  
     3  // Copyright 2009 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test communication with multiple simultaneous goroutines.
     8  
     9  package main
    10  
    11  import "runtime"
    12  
    13  const N = 1000 // sent messages
    14  const M = 10   // receiving goroutines
    15  const W = 2    // channel buffering
    16  var h [N]int   // marking of send/recv
    17  
    18  func r(c chan int, m int) {
    19  	for {
    20  		select {
    21  		case r := <-c:
    22  			if h[r] != 1 {
    23  				println("r",
    24  					"m=", m,
    25  					"r=", r,
    26  					"h=", h[r])
    27  				panic("fail")
    28  			}
    29  			h[r] = 2
    30  		}
    31  	}
    32  }
    33  
    34  func s(c chan int) {
    35  	for n := 0; n < N; n++ {
    36  		r := n
    37  		if h[r] != 0 {
    38  			println("s")
    39  			panic("fail")
    40  		}
    41  		h[r] = 1
    42  		c <- r
    43  	}
    44  }
    45  
    46  func main() {
    47  	c := make(chan int, W)
    48  	for m := 0; m < M; m++ {
    49  		go r(c, m)
    50  		runtime.Gosched()
    51  	}
    52  	runtime.Gosched()
    53  	runtime.Gosched()
    54  	s(c)
    55  }