go语言day09 通道 协程的死锁

 Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com)

目录

通道

创建通道

                1)无缓冲通道

                2)有缓冲通道

通道的使用

               1) 值从通道入口进

               2)  值从通道出口出

        信道死锁:

                  0)死锁现场0

                  1)死锁现场1

                  1.5)总结通道死锁的两个规律。

                  2)死锁现场2

                  3)死锁现场3

            实际运行情况如下:

                解决方案

                  4)死锁现场4

                 


通道

创建通道

                1)无缓冲通道

                        channels := make( chan  string)

                                   make关键字用来创建切片  字典  通道;在这里make创建了通道类型,通道能传输的值是string类型

                                    无缓冲通道不保存值,只负责即时性的传输。当调用通道只有入口或者只有出口时,发生死锁。

                2)有缓冲通道

                        channels := make(chan string,2)

                                    有缓冲通道可以暂时存储值,channels对象可以存储2个字符串类型的变量。

                                

        

通道的使用

                   channels := make( chan  string)

               1) 值从通道入口进

                        channels <- "ping"

               2)  值从通道出口出

                        msg := <- channels

        信道死锁:

                  0)死锁现场0

                                main()单协程中匿名函数中调用通道入口,func()并没有加go关键字变成协程。

                                main()会运行到 channels <- int(i)这一步,然后期待main()函数的主协程去接收channels传过来的i值。

                                然而main()主协程也就是它本身,自身等待自身,意思是要它在吃饭的同时还要它喝水。

                        其实把匿名方法 func(){  }外壳去掉也一样 ,因为和匿名方法无关嘛,通道的死锁只和协程之间有关。


                  1)死锁现场1

                                和死锁现场0一样。

                                main函数单协程中只有通道的入口或者出口其一。

                  1.5)总结通道死锁的两个规律。

                                      通道是在协程之间传输数据的。通道只存在单协程中调用肯定发生死锁,

因为他不能在从入口传输的过程中 又去出口接收值。这项工作至少要两个协程完成。

                                      只有通道的入口或者出口也会死锁。只有入口协程会等一个出口放值;只有出口协程会等待入口传值。


                  2)死锁现场2

                                ch2 只有入口,没有出口 。go func()线程在ch2的入口出就发生死锁。


                  3)死锁现场3

                             main()主协程执行顺序是 

                                       1) 接收 ch1 出口值 , 等待ch1入口传值完成。

                                       2)在完成主协程步骤1)后 ,

                                             再接收 ch2 出口值。

                              go func()副协程执行顺序

                                        1)从 ch2入口 传输 一个值,等待ch2出口传值完成。

                                        2)在完成副协程步骤1)后,

                                             从 ch1 入口 传输 一个值。

                        两个协程间是并行运行的,每个协程都是一个独立执行的单元,这是协程的特点。

                        mian()协程运行到 <- ch1肯定在等待一个ch1的入口传值

                        go func协程运行到 ch2 <-  "ch2 value"  也在等一个ch2的出口传值。

            实际运行情况如下:

                解决方案

                        mian()协程运行到 <- ch2肯定在等待一个ch2的入口传值

                        go func协程运行到 ch2 <-  "ch2 value"  也在等一个ch2的出口传值。

                        这个时候就是标准的双向奔赴了。


                  4)死锁现场4

                        输出完前两个值后,变成无缓冲通道,这个时候再去获取值和死锁现场0,1一样。

                 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# [0701] Task05 策略梯度、Actor-critic 算法

easy-rl PDF版本 笔记整理 P4、P9 joyrl 比对 补充 P9 - P10 相关 代码 整理 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

气压传感器在自动驾驶汽车还有哪些应用场景

气压传感器在近年来被广泛应用于各种新兴领域&#xff0c;以下是其中几个最新的应用&#xff1a; 1、自动驾驶汽车&#xff1a;自动驾驶汽车需要精确的气压传感器来监测道路上的气压变化&#xff0c;帮助车辆进行准确的定位和导航。气压传感器可以提供高精度、可靠的气压数据&…

ezKL;zk-SNARK;零知识证明简单举例说明

目录 ezKL是什么 一、基本概述 二、技术特点 三、使用场景 四、使用方法 五、结论 zk-SNARK 一、定义与特点 二、工作原理 三、应用场景 四、技术挑战 五、未来发展 零知识证明简单举例说明,怎么使用 例子一:房间钥匙的证明 例子二:身份验证 例子三:球的颜色…

git reset 和 git revert区别

git reset 和 git revert 是两个用于撤销提交历史的 Git 命令&#xff0c;它们的主要区别在于&#xff1a; 1、git reset&#xff1a; 作用&#xff1a;用于将当前分支的 HEAD 指针移动到另一个位置&#xff0c;通常是将其重置到之前的提交上。影响&#xff1a;重置会修改历史…

Nuxt 项目集成第三方UI组件库(九)

Nuxt.js 本身并不提供内置的 UI 组件库&#xff0c;它是一个用于构建服务端渲染&#xff08;SSR&#xff09;和静态生成&#xff08;SSG&#xff09;Vue.js应用的框架。Nuxt.js 的设计目的是提供基础的架构和配置&#xff0c;以便开发者可以根据自己的需求选择和集成第三方 UI …

Java中类加载器引起的ClassNotFoundException和NoClassDefFoundError

在Java开发过程中&#xff0c;ClassNotFoundException和NoClassDefFoundError是两种常见的异常&#xff0c;特别是在涉及类加载器时更容易遇到。本文将探讨这两种异常的成因、区别以及如何解决由类加载器引起的问题。 一、理解ClassNotFoundException和NoClassDefFoundError …

GUKE万能工具箱(附带源码)

GUKE万能工具箱&#xff08;附带源码&#xff09; 效果图部分源码领取完整源码下期更新 效果图 部分源码 <!DOCTYPE html> <html><head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1"…

哏号分治,CF103D - Time to Raid Cowavans

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 103D - Time to Raid Cowavans 二、解题报告 1、思路分析 想了半天数据结构最终选择根号分治 我们考虑 大于 550 的公差直接暴力 小于550 的公差的所有询问&#xff0c;我们直接计算该公差后缀和&#xf…

每天一个项目管理概念之项目章程

项目管理中&#xff0c;项目章程扮演着至关重要的角色。它是项目正式启动的标志&#xff0c;为项目的执行提供法律和组织上的认可。项目章程是项目管理知识体系&#xff08;PMBOK&#xff09;中定义的关键文档之一&#xff0c;对于确保项目的顺利进行具有决定性的影响。 定义与…

strcpy,srtcmp,strlen函数漏洞利用

strcpy,srtcmp,strlen函数漏洞利用 strcpy strcpy函数用于将字符串复制到另一个指针指向的空间中&#xff0c;遇到空字符 **b’x\00’**时停止&#xff0c;&#xff1a; 所以可以利用 strcpy不检查缓冲区 的漏洞&#xff08;构造的字符串要以\0结尾&#xff09;&#xff0c;…

prototype 和 __proto__的区别

prototype 和 __proto__ 在 JavaScript 中都与对象的原型链有关&#xff0c;但它们各自有不同的用途和含义。 prototype prototype 是函数对象的一个属性&#xff0c;它指向一个对象&#xff0c;这个对象包含了可以由特定类型的所有实例共享的属性和方法。当我们创建一个新的…

【力扣】数组中的第K个最大元素

一、题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,…

C++(第五天----多继承、虚继承、虚函数、虚表)

一、继承对象的内存空间 构造函数调用顺序&#xff0c;先调用父类&#xff0c;再调用子类 #include<iostream>using namespace std;//基类 父类 class Base{ public: //公有权限 类的外部 类的内部 Base(){cout<<"Base()"<<endl;}Base(int …

ANN文献综述

人工神经网络文献综述 摘要 人工神经网络&#xff08;Artificial Neural Networks, ANNs&#xff09;是由多个简单的、相互连接的处理单元组成的自适应系统&#xff0c;通过调整这些单元之间的连接强度&#xff0c;ANNs能够实现对复杂数据的建模和预测。本文综述了ANNs的基本…

el-input-number 点击加减只能加一次

el-input-number 点击加减只能加一次 <el-input-number v-model"editForm.quantity" placeholder"请输入下单数量(店均)" change"quantityChangeFn"></el-input-number>需要在方法里面加 this.$forceUpdate() quantityChangeFn(val…

oracle用户过期/设置无限期用户/ORA-28001:the password has expired

oracle默认情况下&#xff0c;新建的账户只有180天的有效期&#xff0c;在有效期到期前一周就会报警。而一旦过了有效期&#xff0c;账户就会被锁定无法登录。所以为了方便起见&#xff0c;要修改oracle用户的有效期为无限。 1.查看用户密码的有效期设置&#xff0c;一般默认的…

【ABB】控制器语言切换

【ABB】控制器语言切换 操作流程演示 操作流程 点击【菜单】点击【Control Panel】点击【Language】点击【Chinese】点击【OK】此时会弹出弹窗&#xff0c;点击【YES】此时控制器会重启&#xff0c;重启完成就是中文了 演示 点击【菜单】 点击【Control Panel】 点击【Langua…

【hive】数据采样

参考https://hadoopsters.com/how-random-sampling-in-hive-works-and-how-to-use-it-7cdb975aa8e2&#xff0c;可以直接查看原文&#xff0c;下面只是对原文进行概括和实际性能测试。 1.distribute by sort by2.测试3.map端数据过滤优化采样 在说数据采样之前&#xff0c;需要…

贪吃蛇——C语言(VS2022含源代码,及源代码zip文件)

一.游戏背景 贪吃蛇是一款在世界上盛名已久的小游戏&#xff0c;贪食蛇游戏操作简单&#xff0c;可玩性比较高。这个游戏难度最大的不是蛇长得很长的时候&#xff0c;而是开始。那个时候蛇身很短&#xff0c;看上去难度不大&#xff0c;却最容易死掉&#xff0c;因为把玩一条小…

包装与食品机械

《包装与食品机械》 中文核心期刊 中国科技核心期刊 投 稿 指 南 总体要求 文稿应具有科学性、创新性、实用性&#xff0c;论点明确&#xff0c;资料真实&#xff0c;文字规范&#xff0c;研究性论文须有统计学处理&#xff0c;数据准确规范。论述过程条理清晰、逻辑严密。…