社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
goroutine
比线程更加轻量自动垃圾回收机制
CSP模型
(Communicating Sequential Processes)sync/atomic包
里提供了最底层的原子操作功能,包括相加
、比较
和交换
操作条件等待
和 互斥量
通道
和 goroutine
goroutine
各自负责一块工作main()
函数所在的 goroutine
称为 主goroutine
,其他附加创建用来负责处理相应工作的 goroutine
简称为 工作goroutine
主goroutine
退出后,其他的 工作 goroutine
也会自动退出,所以我们必须非常小心地保证所有 工作 goroutine
都完成后才让 主goroutine
退出死锁
,这个问题有一点和第一个陷阱是刚好相反的: 所有的工作已经完成了,但是 主 goroutine
和 工作 goroutine
还存活,这种情况通常是由于工作完成了但是 主 goroutine
无法获得 工作 goroutine
的完成状态goroutine
(或者 线程
)都锁定了受保护的资源而且同时尝试去获得对方资源的时候(Go语言里并不多,因为Go程序可以使用 通道
来避免使用锁)主goroutine
在一个 done通道
上等待,根据接收到的消息来判断工作是否完成了sync.WaitGroup
来让每个 工作goroutine
报告自己的完成状态(使用 sync.WaitGroup
本身也会产生死锁,特别是当所有 工作goroutine
都处于锁定状态的时候(等待接受通道的数据)调用 sync.WaitGroup.Wait()
)通道
,在Go语言里仍然可能发生死锁:goroutine
可以相互通知对方去执行某个函数(向对方发一个请求),现在,如果这些被请求执行的函数中有一个函数向执行它的 goroutine
发送了一些东西,例如 数据
,死锁就发生了goroutine
之间提供了一种无锁通信方式(尽管实现内部可能使用了锁,但无需我们关心)发送通道
和 接受通道
(包括它们对应的 goroutine
)都处于同步状态布尔类型
、整型
或者 float64 类型
的值都是安全的,因为它们都是通过复制的方式来传送的,所以在并发时如果不小心大家都访问了一个相同的值,这也没有什么风险(发送字符串
也是安全的,因为Go语言里不允许修改字符串
)指针
或者引用类型
(如切片
或映射
)的安全性,因为指针指向的内容或者所引用的值可能在对方接收到时已被发送方修改指针
和引用
时,有以下方法可以解决:
goroutine
访问得到,也就是说,对这些值的访问必须是串行进行的指针
或者引用
发送之后发送方就不会再访问它,然后让接收者来访问和释放指针
或者引用
指向的值goroutine
去访问它的非导出方法接口类型
的值,也就是说,只要这个值实现了接口定义的所有方法,就可以以这个接口的方式在通道里传输goroutine
里使用(除非文档特别声明),但是对于某些值,它虽然实现了这个接口的方法,但是某些方法也修改了这个值本身的状态,就必须和指针
一样处理,让它的访问串行化如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!