• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2009 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//go:build test_run
6
7// Pass numbers along a chain of threads.
8
9package main
10
11import (
12	"runtime"
13	"strconv"
14
15	"cgostdio/stdio"
16)
17
18const N = 10
19const R = 5
20
21func link(left chan<- int, right <-chan int) {
22	// Keep the links in dedicated operating system
23	// threads, so that this program tests coordination
24	// between pthreads and not just goroutines.
25	runtime.LockOSThread()
26	for {
27		v := <-right
28		stdio.Stdout.WriteString(strconv.Itoa(v) + "\n")
29		left <- 1 + v
30	}
31}
32
33func main() {
34	leftmost := make(chan int)
35	var left chan int
36	right := leftmost
37	for i := 0; i < N; i++ {
38		left, right = right, make(chan int)
39		go link(left, right)
40	}
41	for i := 0; i < R; i++ {
42		right <- 0
43		x := <-leftmost
44		stdio.Stdout.WriteString(strconv.Itoa(x) + "\n")
45	}
46}
47