Go 语言那些事儿之浅谈协程并发竞争资源问题
Go 语言那些事儿之浅谈协程并发竞争资源问题
我们在实际操作过程中,往往会遇到拥有多条协程并发的情况,那么当多条协程并发时,协程之间是如何竞争有限的资源的呢?本文将介绍有关内容。
我们先看一看本文实例代码的主函数,两条子协程,主协程 3 秒后结束。
再看看看两条子协程分别是干些什么吧!
fun1 函数,是遍历输出"就像老鼠爱大米",值得注意的是,这里使用 for...range 循环遍历字符串的话,不能使用fmt.Println
,因为如果这里使用Println
的话,输出的会是字符在字符集中的编号。
而fmt.Printf
这里 f 是 format 也就是格式化的意思。
看看运行结果
发现两条协程运行的结果均匀分布。这就说明两条协程公平竞争资源,两条协程之间实力旗鼓相当。
可如果激活 fun1 内的runtime.Goexit()
那么输出结果就是:
如果激活 fun2 内的runtime.Goexit()
那么输出结果就是:
因为Goexit
杀掉它的 goroutine,其他 goroutine 也不会受到影响。所以当 fun1 的所在的子协程被杀死时,不会影响 fun2 所在的子协程的正常运行。
如果本段代码中两个runtime.Goexit()
都激活,那么两条协程都只会输出一个字符。
因为两条协程在输出完一个字符后就被杀死了。
如果两个及以上个协程在没有同步的情形下去访问共享的资源,并且尝试同一时间读和写共享的资源。就会出现资源竞争问题。出现的这个问题能够让程序变得稍微复杂,本文就暂时不讨论这些复杂情况,想知道的可以关注博主,博主后期会介绍。
我们也可以使用 go build
的 -race
参数,使用它可以了解是否存在资源竞争问题,关于 go build
的 -race
参数的使用,本篇博文暂不介绍,后期博主会尽量详细介绍。
评论