// 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 ( "runtime"; "stdio"; "strconv"; ) func fibber(c, out chan int64, i int64) { // Keep the fibbers in dedicated operating system // threads, so that this program tests coordination // between pthreads and not just goroutines. runtime.LockOSThread(); if i == 0 { c <- i; } for { j := <-c; stdio.Puts(strconv.Itoa64(j)); out <- j; <-out; i += j; c <- i; } } func main() { c := make(chan int64); out := make(chan int64); go fibber(c, out, 0); go fibber(c, out, 1); <-out; for i := 0; i < 90; i++ { out <- 1; <-out; } }