初识 golang 资源竞争

本贴最后更新于 1633 天前,其中的信息可能已经沧海桑田

go 语言的的资源竞争问题.使用原子函数保证原子性操作.可以解决.

一、概述

这里利用原子方法进行标记(StoreInt64) 然后 LoadInt64 取的标记值 , 这个一系列操作是安全访问的启动了两个 goroutine,并完成一些工作。在各自循环的每次迭代之后, goroutine 会使用 LoadInt64 来检查 shutdown 变量的值。这个函数会安全地返回 shutdown 变量的一个副本。如果这个副本的值为 1, goroutine 就会跳出循环并终止。
main 函数使用 StoreInt64 函数来安全地修改 shutdown 变量的值。如果哪个 doWork goroutine 试图在 main 函数调用 StoreInt64 的同时调用 LoadInt64 函数,那么原子函数会将这些调用互相同步,保证这些操作都是安全的,不会进入竞争状态.

二、代码

创建变量

var (
	//定义一个shutdown是通知正在执行的goroutine停止工作标注
	shutdown int64
	//定义一wg4等待程序结束
	wg4 sync.WaitGroup
)

创建 doWork

这个是用来模拟工作的 goroutine
检查之前的 shutdown 标志来确定是否提前终止

func doWorks(name string) {
	defer wg4.Done()
	for {
		fmt.Printf("Doing %s Work\n", name)
		time.Sleep(250 * time.Microsecond)
		//判断是否要停止工作
		if atomic.LoadInt64(&shutdown) == 1 {
			fmt.Printf("Doing %s Down\n", name)
			//跳出循环
			break
		}
	}
}

创建 main

func main() {
	//建立两个goroutine 计数器2
	wg4.Add(2)
	//使用两个协程 goroutine
	go doWorks("A")
	go doWorks("B")
	//给goroutine的运行时间
	time.Sleep(1 * time.Second)
	//该停止工作了,安全设置shutdown标志
	fmt.Println("Shutdown Now")
	atomic.StoreInt64(&shutdown, 1)
	//等待goroutine结束
	wg4.Wait()
}

记得导入包.

参考

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 375 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...