github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/misc/cgo/gmp/fib.go (about) 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 // +build ignore 6 7 // Compute Fibonacci numbers with two goroutines 8 // that pass integers back and forth. No actual 9 // concurrency, just threads and synchronization 10 // and foreign code on multiple pthreads. 11 12 package main 13 14 import ( 15 big "." 16 "runtime" 17 ) 18 19 func fibber(c chan *big.Int, out chan string, n int64) { 20 // Keep the fibbers in dedicated operating system 21 // threads, so that this program tests coordination 22 // between pthreads and not just goroutines. 23 runtime.LockOSThread() 24 25 i := big.NewInt(n) 26 if n == 0 { 27 c <- i 28 } 29 for { 30 j := <-c 31 out <- j.String() 32 i.Add(i, j) 33 c <- i 34 } 35 } 36 37 func main() { 38 c := make(chan *big.Int) 39 out := make(chan string) 40 go fibber(c, out, 0) 41 go fibber(c, out, 1) 42 for i := 0; i < 200; i++ { 43 println(<-out) 44 } 45 }