diff options
Diffstat (limited to 'misc/cgo/gmp/fib.go')
| -rw-r--r-- | misc/cgo/gmp/fib.go | 43 | 
1 files changed, 43 insertions, 0 deletions
| diff --git a/misc/cgo/gmp/fib.go b/misc/cgo/gmp/fib.go new file mode 100644 index 000000000..02b98b108 --- /dev/null +++ b/misc/cgo/gmp/fib.go @@ -0,0 +1,43 @@ +// 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. + +// Compute Fibonacci numbers with two goroutines +// that pass integers back and forth.  No actual +// concurrency, just threads and synchronization +// and foreign code on multiple pthreads. + +package main + +import ( +	big "gmp"; +	"runtime"; +) + +func fibber(c chan *big.Int, out chan string, n int64) { +	// Keep the fibbers in dedicated operating system +	// threads, so that this program tests coordination +	// between pthreads and not just goroutines. +	runtime.LockOSThread(); + +	i := big.NewInt(n); +	if n == 0 { +		c <- i; +	} +	for { +		j := <-c; +		out <- j.String(); +		i.Add(i, j); +		c <- i; +	} +} + +func main() { +	c := make(chan *big.Int); +	out := make(chan string); +	go fibber(c, out, 0); +	go fibber(c, out, 1); +	for i := 0; i < 200; i++ { +		println(<-out); +	} +} | 
