[Go] golang原子函数实现goroutine同步
程序员文章站
2022-05-25 19:49:32
启动了两个goroutine,并完成一些工作。在各自循环的每次迭代之后,在goroutine 会使用LoadInt64 来检查shutdown 变量的值。这个函数会安全地返回shutdown 变量的一个副本。如果这个副本的值为1,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
}
}
}
上一篇: 裴子野是个怎样的人?该怎么评价裴子野?
下一篇: 上世界新闻头条