[Go] golang原子函数实现goroutine同步

启动了两个goroutine,并完成一些工作。在各自循环的每次迭代之后,在goroutine 会使用LoadInt64 来检查shutdown 变量的值。这个函数会安全地返回
shutdown 变量的一个副本。如果这个副本的值为1,goroutine 就会跳出循环并终止。

package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

var (
	//通知正在执行的goroutine停止工作的标志
	shutdown int64
	//计数信号量
	wg sync.WaitGroup
)

func main() {
	//计数加2,等待两个goroutine
	wg.Add(2)
	//创建两个goroutine
	go doWork("A")
	go doWork("B")
	//主groutine睡眠1秒
	time.Sleep(1 * time.Second)
	fmt.Println("主:立刻关闭")
	//安全的赋值全局变量
	atomic.StoreInt64(&shutdown, 1)
	//主goroutine等待子goroutine结束
	wg.Wait()
}

//模拟执行工作的goroutine
//检测主goroutine设定的值shutdown来决定是否提前终止
func doWork(name string) {
	defer wg.Done()
	for {
		fmt.Printf("%s 工作 \r\n", name)
		//子goroutine睡眠250毫秒
		time.Sleep(250 * time.Millisecond)
		//子goroutine读取全局变量
		if atomic.LoadInt64(&shutdown) == 1 {
			//停止
			fmt.Printf("关闭 %s \r\n", name)
			break
		}
	}
}

  

原文地址:https://www.cnblogs.com/taoshihan/p/10385900.html

时间: 2024-10-07 14:46:25

[Go] golang原子函数实现goroutine同步的相关文章

使goroutine同步的方法总结

前言: 在前面并发性能对比的文章中,我们可以看到Golang处理大并发的能力十分强劲,而且开发也特别方便,只需要用go关键字即可开启一个新的协程. 但当多个goroutine同时进行处理的时候,就会遇到同时抢占一个资源的情况(并发都会遇到的问题),所以我们希望某个goroutine等待另一个goroutine处理完某一个步骤之后才能继续.sync包就是为了让goroutine同步而出现的.当然还可以使用channel实现,这个后面会介绍到. 锁: 锁有两种:互斥锁(mutex)和读写锁(RWMu

go语言--竞争、原子函数、互斥锁

一.go语言竞争状态.原子函数.互斥锁 下面代码例子是展示并发下公共数据操作,通过原子函数和互斥锁怎么解决. package main import ( "sync" "runtime" "fmt" "sync/atomic" ) var( // counter是所有goroutine都要增加的变量 counter int64 // wg用来等待程序的结束 wg sync.WaitGroup // mutex 用来定义一段代码

golang的函数

在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http.HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 就是使用上述思想实现. type HandlerFunc func(ResponseWriter, *Request) func (f HandlerFunc) Se

Golang理解-函数变量

函数变量 函数作为变量值 函数变量是把函数作为值保存到变量中. 在Golang中,,函数也是一种类型,可以和其他类型一样被保存在变量中.例如: package main // 将函数作为值保存到变量中 import ( "fmt" ) func fire() { fmt.Println("fire") } func main(){ f := fire() // 将变量f声明为func()类型,此时f就被俗称为"回调函数", 此时f的值为nil f

golang(06)函数介绍

原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民.也是使用好golang的必备技能.看下golang函数的格式 123 func 函数名(函数参数)返回值类型{ } 一个简单的函数 123 func HelloFunc(str string) string{ return str} 该函数返回传入的字符串,函数调用如下 1 fmt.Println

golang原子库atomic

package atomic import ( "unsafe" ) // BUG(rsc): On x86-32, the 64-bit functions use instructions unavailable before the Pentium MMX. // // On non-Linux ARM, the 64-bit functions use instructions unavailable before the ARMv6k core. // // On both 

Golang tips ----- 函数

1.在函数调用时,Golang没有默认参数值 2.一个函数声明如果没有函数体,表面该函数不是由Golang实现的,这样的声明定义了函数标识符 3.拥有函数名的函数只能在包级语法块中被声明 4.函数值(闭包)属于引用类型并且不可比较 5.在循环中生成的所有函数值共享相同的循环变量,并且需要注意的是,函数值记录的是循环变量的地址,而不是循环变量某一刻的值.如果函数值都在循环结束运行的话,那对于循环变量,每个函数对应的都是相同的值.如下面的代码所示,最后迭代运行函数切片,输出的都将是相同的值5.因为它

go语言:一个简单的goroutine同步(synchronize)

我们可以使用channels在多个goroutine之间进行同步(synchronize), 下面直接看例子. 例子 1, 使用chan等待一个goroutine结束. package main import "fmt" import "time" //在这定义一个函数,以goroutine的方式运行.使用done这个chan来通知 //其它的函数本函数的工作已成.这个例子是通知main函数. func worker(done chan bool) { fmt.Pr

golang 原子操作函数

golang中的原子操作在sync/atomic package中. 下文以比较和交换操作函数为例,介绍其使用. CompareAndSwapInt32 比较和交换操作是原子性的. // CompareAndSwapInt32 executes the compare-and-swap operation for an int32 value. func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool) 判断参数add