// $G $D/$F.go && $L $F.$A && ./$A.out | |
// 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. | |
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 { | |
panicln("r", | |
"m=", m, | |
"r=", r, | |
"h=", h[r]); | |
} | |
h[r] = 2; | |
} | |
} | |
} | |
func | |
s(c chan int) { | |
for n:=0; n<N; n++ { | |
r := n; | |
if h[r] != 0 { | |
panicln("s"); | |
} | |
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); | |
} |