一、go语言竞争状态、原子函数、互斥锁

下面代码例子是展示并发下公共数据操作,通过原子函数和互斥锁怎么解决。

package mainimport ("sync""runtime""fmt""sync/atomic"
)var(// counter是所有goroutine都要增加的变量counter int64// wg用来等待程序的结束wg sync.WaitGroup// mutex 用来定义一段代码临界区mutex sync.Mutex
)func main() {// 计数加2,表示要等待两个goroutinewg.Add(2)// 创建两个goroutinego incCounter(1)go incCounter(2)// 等待goroutine结束wg.Wait()fmt.Println("Final Counter:", counter)
}// incCounter增加包里counter变量的值
func incCounter(id int) {// 延时调用,在函数退出时调用Done来通知main函数工作已经完成defer wg.Done()for count := 0; count < 2; count++ {// 捕获counter的值value := counter// 当前goroutine从线程退出,并放回到队列runtime.Gosched()// 增加本地value变量的值value++// 将该值保存回countercounter = value}
}
// incCounter增加包里counter变量的值
func incCounter1(id int) {defer wg.Done()for count := 0; count < 2; count++ {// 安全的对counter加1atomic.AddInt64(&counter, 1)// 当前goroutine从线程退出,并放回到队列runtime.Gosched()}
}// incCounter增加包里counter变量的值
func incCounter2(id int) {// 延时调用,在函数退出时调用Done来通知main函数工作已经完成defer wg.Done()for count := 0; count < 2; count++ {// 同一时刻只允许一个goroutine进入这个临界区mutex.Lock(){// 捕获counter的值value := counter// 当前goroutine从线程退出,并放回到队列runtime.Gosched()// 增加本地value变量的值value++// 将该值保存回countercounter = value}// 释放锁,允许其他正在等待的goroutine进入临界区mutex.Unlock()}
}
  • 下面图片是竞争状态下的数据交互模型

转载于:https://www.cnblogs.com/wudiffs/p/11576683.html

go语言--竞争、原子函数、互斥锁相关推荐

  1. Go语言的原子操作和互斥锁的区别

    这个系列的文章里介绍了很多并发编程里经常用到的技术,除了Context.计时器.互斥锁还有通道外还有一种技术--原子操作在一些同步算法中会被用到.今天的文章里我们会简单了解一下Go语言里对原子操作的支 ...

  2. Python多任务(3.线程--多线程共享全局变量,利用同步解决资源竞争,利用互斥锁)

    1. 线程之间是共享全局变量的 验证代码: import threading import time# 定义一个全局变量 g_num = 100def test1(): # 修改g_num的值glob ...

  3. Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  4. Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  5. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]

    本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...

  6. C/C++ 线程三种并发方式比较(传统互斥量加锁方式, no lock不加锁的方式, 原子函数方式)

    执行速度结果: 传统互斥量加锁方式 < no lock不加锁的方式 < 原子函数方式 正文如下: 最近编码需要实现多线程环境下的计数器操作,统计相关事件的次数.下面是一些学习心得和体会.不 ...

  7. Go语言 读写锁互斥锁原理剖析(2)

    互斥锁(百科)定义:"在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个 ...

  8. c++11 多线程编程(三)------ 竞争和互斥锁

    竞争条件 并发代码中最常见的错误之一就是竞争条件(race condition).而其中最常见的就是数据竞争(data race),从整体上来看,所有线程之间共享数据的问题,都是修改数据导致的,如果所 ...

  9. openmp 互斥锁 mysql_openMP 函数总结(并行程序设计导论)

    本篇文章只是记录api的用法和回顾,方便记忆 openMP openMP提供"基于指令"的共享内存API.这就意味着在c和c++中,有一些特殊的预处理指令pragma.在系统中加入 ...

最新文章

  1. XHTML5 与 HTML 4.01的差异
  2. 对比less聊scss(1):scss特性
  3. gethostbyname()函数:通过域名获取IP地址
  4. spotlight soo5072:there was an error reading the tnsnames.ora
  5. Python之打造专属Python开发者的完美终端工具Rich
  6. 计算机二级ps教程 百度云,全国计算机等级考试一级Photoshop模拟题及解析第六套(完整版).pdf...
  7. js各种for循环及性能比较
  8. 啦啦外卖独立版40.4最新外卖源码全开源
  9. chrome frame使用记录
  10. PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选择的问题
  11. win10下Java的JDK11下载与安装教程
  12. win10计算机无动作后锁屏,怎么让win10不锁屏_让win10不锁屏的操作方法
  13. python批量裁剪图片
  14. JAVA工具类——身份证校验
  15. Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
  16. linux sftp拷贝文件夹,Linux下sftp命令传输文件的例子
  17. C语言程序中紧急情况,《C语言及程序设计》实践参考——紧急救援
  18. 全国青少年软件编程等级考试--scratch-三级-真题-五彩糖葫芦
  19. Berkeley DB
  20. 方便面产业的繁荣重生记

热门文章

  1. 大数据分析有什么特点
  2. Java对象的两大特征_科学网—Java 面向对象的四个特征 - 李玖栋的博文
  3. python类似turtle的库_Python库——turtle
  4. sharepoint html 编辑器 ,使用 Web 部件自定义页面简介
  5. Ray︱高性能的分布式执行引擎 起个头~
  6. 一句python,一句R︱列表、元组、字典、数据类型、自定义模块导入(格式、去重)
  7. 【Stimulsoft Reports Silverlight教程】使用报表组件
  8. 人工智能将为维护网络安全带来更多可能
  9. Linux 学习笔记 (四)Ubuntu14.04 解决上网问题安装无线网卡驱动
  10. 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序