启动了两个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同步的更多相关文章

  1. [Go] golang原子函数锁住共享资源

    1.atomic包里的几个函数以及sync包里的mutex类型,提供了解决方案2.原子函数能够以很底层的加锁机制来同步访问整型变量和指针3.atomic.AddInt64(&counter, ...

  2. golang-----golang sync.WaitGroup解决goroutine同步

    go提供了sync包和channel来解决协程同步和通讯.新手对channel通道操作起来更容易产生死锁,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题. 从字面就可以理解, ...

  3. 使goroutine同步的方法总结

    前言: 在前面并发性能对比的文章中,我们可以看到Golang处理大并发的能力十分强劲,而且开发也特别方便,只需要用go关键字即可开启一个新的协程. 但当多个goroutine同时进行处理的时候,就会遇 ...

  4. golang的函数

    在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http. ...

  5. golang(06)函数介绍

    原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民 ...

  6. golang笔记——函数与方法

    如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...

  7. Golang tips ----- 函数

    1.在函数调用时,Golang没有默认参数值 2.一个函数声明如果没有函数体,表面该函数不是由Golang实现的,这样的声明定义了函数标识符 3.拥有函数名的函数只能在包级语法块中被声明 4.函数值( ...

  8. Interlocked原子函数陷阱

    一.问题 windows api函数中提供了InterlockedExchange.InterlockedDecrement, InterlockedIncrement, ExInterlockedA ...

  9. golang 原子操作函数

    golang中的原子操作在sync/atomic package中. 下文以比较和交换操作函数为例,介绍其使用. CompareAndSwapInt32 比较和交换操作是原子性的. // Compar ...

随机推荐

  1. centos 踩坑集锦

    定时任务 top 命令添加定时任务无效 我通过以下命令获取总进程数与僵尸进程数 vim procs.sh procs_total=`/bin/top -n 1|grep Tasks|sed 's/,/ ...

  2. [LeetCode] Leaf-Similar Trees 叶结点相似的树

    Consider all the leaves of a binary tree.  From left to right order, the values of those leaves form ...

  3. idea破解失效:cant obtain ticket from http://idea.iteblog.com/key.php

    破解idea错误描述:cant obtain ticket from http://idea.iteblog.com/key.php   idea破解失效 解决方案: 打开链接: http://ide ...

  4. 32、可以拿来用的JavaScript实用功能代码

    可以拿来用的JavaScript实用功能代码(可能会有些bug,用时稍微修改下,我用了几个还可以) 转载自 1.原生JavaScript实现字符串长度截取 function cutstr(str, l ...

  5. cadence PCB板级设计

    总结PCB板框设计,定位孔的放置,以及布线区域和元件放置区域的放置,最重要的是层叠结构的设计.

  6. No Spring WebApplicationInitializer types detected on classpath 问题的一种解决办法

    今天在idea中编译部署工程,tomcat报了这个错误: No Spring WebApplicationInitializer types detected on classpath 导致前端页面访 ...

  7. OSGi解决的问题

    osgi最明显的缺陷 bundle尽管可以为隔离的服务建立独立生命周期管理的热部署方式,以及明确的服务导出和导入依赖能力,但是其最终基于jvm,无法对bundle对应的服务实现计算资源的隔离,一个服务 ...

  8. Websocket实现即时通讯

    前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕业之后的第一份工作.直到最近换了工作,到了一家是含有IM社交聊天功能的app的时候,我觉得我现在可以谈谈 ...

  9. Javascript中的this关键字用法详解

    在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例. 而是作为一个单独的指针,在不同的情况之下,指向不同的位置,这也是为什么我们会将它搞混 ...

  10. CSS3禁止用户选中文字——user-select: none;

    需求:现在有一个需求是在移动端让你禁止用户选中文字,你会怎么做呢?如下图    解决方法:使用CSS3新增属性 user-select: none;   -webkit-user-select:non ...