channel vs mutex

记录许总演讲PPT指出的实践:

channel
– 本质上是一个 MessageQueue
– 非常正统的执行体间通讯设施
• sync.Mutex/RWMutex/Cond/etc
– 不要把 channel 当做万金油,该 Mutex 还是要

• 误区
– 用 channel 来做互斥 ( 正常应该让 Mutex 做 )
• 比如多个 goroutine 访问一组共享变量

• channel 的成本

– 作为消息队列, channel 成本原高于 Mutex

– 成本在哪?
• channel 内部有 Mutex ,因为它本身属于共享变量
• channel 内部可能有 Cond ,用来等待或唤醒满足条件的
goroutine
• 出让 cpu 并且让另一个 goroutine 获得执行机会,这个切
换周期不低,远高于 Mutex 检查竞争状态的成本 ( 后者通常
只是一个原子操作 )

时间: 2024-11-20 19:53:56

channel vs mutex的相关文章

Golang并发中channel的分析

问题:面对并发问题,是用channel解决,还是用Mutex解决? 如果自己心里还没有清晰的答案,那就读下这篇文章,你会了解到: 使用channel解决并发问题的核心思路和示例 channel擅长解决什么样的并发问题,Mutex擅长解决什么样的并发问题 一个并发问题该怎么入手解解决 一个重要的plus思维 前戏 前面很多篇的文章都在围绕channel介绍,而只有前一篇sync的文章介绍到了Mutex,不是我偏心,而是channel在Golang是first class级别的,设计在语言特性中的,

Rust的“并发安全”设计

部分内容参考Aaron Turon的文章<Fearless Concurrency with Rust > 昨天发了一篇说异步IO和轻量级线程的文章,有人问我为什么不在后面补充一下rust的并发模型.其实rust并不存在一个独特的并发模型,但它从语言层面上提供了一整套机制来保证并发的安全,借助这套机制,你可以安全的实现很多并发模型,如消息传递式.共享状态式.无锁式和纯函数式.昨天晚上我在群里和人讨论有关设计的话题,我觉得一个好的设计应当有两方面表现,一方面是符合直觉,也就是各个方面保证一致性以

Golang Data Race Detector

原文链接:http://maoqide.live/post/golang/golang-data-race-detector/ [译] https://golang.google.cn/doc/articles/race_detector.html golang 中的几种 Data Race 场景及 Data Race 检测工具. Introduction 数据竞争是并发系统中最常见和最难 debug 的 bug 类型之一,当两个 goroutine 同时访问同一个变量并且至少有一个是写入时,就

go脚手架link源码分析

一直觉得这是个非常优秀的项目,非常精练,值得一读. 昨天下班特意画一个小时读了一遍,代码非常短,使用go做网络开发的同学可以读一下. 短小精悍,今天特写写了一篇博客介绍下.读起来特别开心.针对. 项目地址 https://github.com/funny/link 项目的使用,从官网抄的 package main import ( "log" "net" "github.com/funny/link" "github.com/funny

go语言中sync包和channel机制

文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程.更高级的同步操作通过信道与通信进行. type Co

Go语言8-goroutine和channel

Goroutine Go语言从语言层面上就支持了并发,这与其他语言大不一样.Go语言中有个概念叫做goroutine,这类似我们熟知的线程,但是更轻. 进程.线程.协程 进程和线程进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行.所以程序的类型可以分为以下几种: 一个进程,它只有一个线程,就是单线程程序 一

如何优雅的关闭golang的channel

How to Gracefully Close Channels,这篇博客讲了如何优雅的关闭channel的技巧,好好研读,收获良多. 众所周知,在golang中,关闭或者向已关闭的channel发送数据都会引发panic. 谨遵优雅关闭channel的原则 不要在接受一端关闭channel 不要在有多个并发的senders中关闭channel.反过来说,如果只有一个协程充当sender,那么我们可以在这个sender协程内关闭掉channel. 一个简单的方法 SafeClose type M

10.Go-goroutine,waitgroup,互斥锁,channel和select

10.1.goroutine goroutine的使用 //Learn_Go/main.go package main import ( "fmt" "time" ) func demo(count int) { for i :=1; i < 10; i++{ fmt.Println(count,":",i) } } func main() { for i :=1; i < 10; i++{ go demo(i) } //添加休眠时间

Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

如题,使用条件变量Cond和channel通道实现多个生产者和消费者模型.Go语言天生带有C语言的基因,很多东西和C与很像,但是用起来 绝对比C语言方便.今天用Go语言来实现下多消费者和生产者模型.如果对C语言的多生产者和消费者模型感兴趣的可以看Linux系统编程:使用mutex互斥锁和条件变量实现多个生成者和消费者模型 代码实现代码实现用了Cond条件变量和channel通道. package main import ( "fmt" "math/rand" &qu