github.com/euank/go@v0.0.0-20160829210321-495514729181/misc/cgo/stdio/fib.go (about) 1 // cmpout 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 // +build test_run 8 9 // Compute Fibonacci numbers with two goroutines 10 // that pass integers back and forth. No actual 11 // concurrency, just threads and synchronization 12 // and foreign code on multiple pthreads. 13 14 package main 15 16 import ( 17 "runtime" 18 "strconv" 19 20 "../stdio" 21 ) 22 23 func fibber(c, out chan int64, i int64) { 24 // Keep the fibbers in dedicated operating system 25 // threads, so that this program tests coordination 26 // between pthreads and not just goroutines. 27 runtime.LockOSThread() 28 29 if i == 0 { 30 c <- i 31 } 32 for { 33 j := <-c 34 stdio.Stdout.WriteString(strconv.FormatInt(j, 10) + "\n") 35 out <- j 36 <-out 37 i += j 38 c <- i 39 } 40 } 41 42 func main() { 43 c := make(chan int64) 44 out := make(chan int64) 45 go fibber(c, out, 0) 46 go fibber(c, out, 1) 47 <-out 48 for i := 0; i < 90; i++ { 49 out <- 1 50 <-out 51 } 52 }