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

时间:2023-03-09 00:44:57
[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
}
}
}

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