2013年6月

阻塞channel优先返回给主线程

昨天在别人发了个用golang的channel写菲波拉契数列的代码,说是有问题,然后我试着撸一个,结果发现管道阻塞状态下的一个trap,就是当主线程和子线程同时阻塞一个管道时,当管道有了数据是优先返回给主线程的.测试代码如下:

package main

import (
    ."fmt"
)

func fbi(num int,ch chan int){
    if num<3 {
        ch<-num;
    }else{
        /*
        cl:=make(chan int);
        go fbi(num-2,cl);
        tmp:=<-cl;
        cr:=make(chan int);
        go fbi(num-1,cr);
        tmp+=<-cr;
        ch<-tmp;
        */
        go fbi(num-2,ch);
        r:=<-ch;
        Println("in go");
        go fbi(num-1,ch);
        l:=<-ch;
        ch<- (l+r);
    }
}

func main(){
    ch:=make(chan int);
    go fbi(10,ch);
    Println(<-ch);
    Println("in main go");
}