// run | |
// Copyright 2009 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
// Test communication with multiple simultaneous goroutines. | |
package main | |
import "runtime" | |
const N = 1000 // sent messages | |
const M = 10 // receiving goroutines | |
const W = 2 // channel buffering | |
var h [N]int // marking of send/recv | |
func r(c chan int, m int) { | |
for { | |
select { | |
case r := <-c: | |
if h[r] != 1 { | |
println("r", | |
"m=", m, | |
"r=", r, | |
"h=", h[r]) | |
panic("fail") | |
} | |
h[r] = 2 | |
} | |
} | |
} | |
func s(c chan int) { | |
for n := 0; n < N; n++ { | |
r := n | |
if h[r] != 0 { | |
println("s") | |
panic("fail") | |
} | |
h[r] = 1 | |
c <- r | |
} | |
} | |
func main() { | |
c := make(chan int, W) | |
for m := 0; m < M; m++ { | |
go r(c, m) | |
runtime.Gosched() | |
} | |
runtime.Gosched() | |
runtime.Gosched() | |
s(c) | |
} |