阻塞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");
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java大联盟

手写一个WEB应用服务

之前有小伙伴向我请教一道笔试题:要求写出一个WEB应用服务,不得使用Servlet接口,用Socket实现,可以响应get请求,打印请求信息,并判断请求资源,若...

844
来自专栏walterlv - 吕毅的博客

使用 Task.Wait()?立刻死锁(deadlock)

发布于 2017-10-27 15:54 更新于 2018-04...

411
来自专栏菩提树下的杨过

spring集成kafka

一、添加依赖项 compile 'org.springframework.kafka:spring-kafka:1.2.2.RELEASE' 二、发消息(生产者...

2028
来自专栏Golang语言社区

使goroutine同步的方法总结

在前面并发性能对比的文章中,我们可以看到Golang处理大并发的能力十分强劲,而且开发也特别方便,只需要用go关键字即可开启一个新的协程。

883
来自专栏BY的专栏

GCD调度组

2755
来自专栏Phoenix的Android之旅

Android基础操作-文件解压缩

文件操作是Android中经常遇到的问题,比如复制/删除, 最近会贡献一些平时开发中积累下来的工具类,希望能免去大家造轮子的体力活。 今天贡献一个解压缩zip文...

824
来自专栏杨建荣的学习笔记

通过java程序抽取日志中的sql语句(r4笔记第4天)

今天在翻看以前的笔记时,发现自己在很早之前写过一个java程序,能够解析日志中的sql语句。 当时使用的环境是weblogic,日志目录下总是有几十上百个日志文...

2856
来自专栏智能算法

Python学习(九)---- python中的线程

原文地址: https://blog.csdn.net/fgf00/article/details/52773459 编辑:智能算法,欢迎关注! 上期我们一起学...

1072
来自专栏Java编程技术

使用数据库悲观锁实现不可重入的分布式锁

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源...

551
来自专栏TechBox

GCD信号量-dispatch_semaphore_t

1831

扫码关注云+社区