导言
前面我们介绍了go语言进阶使用的一些方面,涉及到go语言的并行,协程的定义以及使用,goroutine的使用,channel的使用,生产者消费者问题,本文将继续这个话题的浅谈...
1.并发通信
关键字 go 的引入使得在Go语言中并发编程变得简单,但同时存在并发编程的原生复杂性。不管是什么平台,什么编程语言,并发都是一个大问题。想实现多个对象的并发,难就难在协调问题,而协调就要通过交流,所以,并发对象间的通信是最大的问题。在工程上,有两种最常见的并发通信模型:共享数据和消息。
共享数据是指多个并发单元分别保持对同一个数据的引用,类似于liunx系统的共享资源区,通过互斥信号量的使用来实现多个单元对一个资源对象的存取改变,从而实现通信。共享的数据可能有多种形式,比如内存数据块、磁盘文件、网络数据等。在实际工程应用中最常见的无疑是内存了,也就是常说的共享内存。
在C语言中通常是这样处理线程间数据共享的
将其改写成go语言代码
在 10 个 goroutine 中共享了变量 counter。每个 goroutine 执行完成后,会将 counter 的值加 1。因为 10 个 goroutine 是并发执行的,引入锁,也就是lock 变量。每次对 n 的操作,都要先将锁锁住,操作完成后,再将锁打开。
在 main 函数中,当值达到 10 时,说明所有 goroutine 都执行完毕了,这时主函数返回,程序退出。
但是这么写极其臃肿和狼狈,并没有实现go语言的核心优势,所以就会用到前面提到过的channel消息通信机制。
2.借助通道实现Go语言并发打印
这个例子将goroutine 和 channel 放在一起展示它们的用法。
输出如下:
典型的生产者和消费者,不再赘述,注释已解释。