了解 Go 中原子操作的重要性与使用方法

欧易OKX

欧易OKX

               

欧易OKx是全球三大比特币交易所之一,注册即开最高6万元盲盒,100%中奖!

           官网注册
在 Go 中,原子操作是确保并发程序正确性和性能的重要工具。通过允许对共享内存进行安全操作,它们使开发人员能够编写高效可靠的并发代码。

引言

并发是现代软件开发的一个基本方面,而在 Go 中编写并发程序相对来说是一个相对轻松的任务,这要归功于其强大的并发支持。

Go 提供了对原子操作的内置支持,这在同步并发程序中起着至关重要的作用。在本篇博客文章中,我们将探索 Go 中原子操作的概念,了解为什么它们是重要的,以及如何有效地使用它们。

什么是 Go 中的原子操作?

在 Go 中,原子操作是无需中断或受其他并发操作干扰而执行的操作。它们用于确保对共享变量的某些操作被原子地执行,这意味着它们作为一个单一的、不可分割的单元执行,并且不受其他 goroutine 或线程的干扰或数据竞争的影响。

Go 提供了一个名为 sync/atomic 的包,其中包含一组用于对原始数据类型(如整数和指针)执行原子操作的函数。在 Go 中,一些常用的原子操作包括:

  • Load(加载)
  • atomic.Load* 函数用于原子地读取变量的值。例如,atomic.LoadInt32 用于原子地加载 int32 变量的值。
  • Store(存储)
  • atomic.Store* 函数用于原子地设置变量的值。例如,atomic.StoreInt32 用于原子地设置 int32 变量的值。
  • Add 和 Subtract(增加和减少)
  • atomic.Add* 和 atomic.Sub* 函数用于原子地增加或减少变量的值。
  • Compare and Swap(CAS,比较并交换)
  • atomic.CompareAndSwap* 函数用于原子地比较变量的当前值与期望值,并在它们匹配时将变量设置为一个新值。这通常用于实现无锁的数据结构和算法。
  • Swap(交换)
  • atomic.Swap* 函数用于原子地交换变量的值与一个新值。

这些原子操作在并发环境中与共享变量一起使用时非常有价值,可以防止数据竞争,并确保对变量的操作安全且一致地执行。它们有助于构建并发数据结构、同步原语以及以线程安全的方式管理共享资源。

使用这些操作时是否需要互斥锁?

在 Go 中,sync/atomic 包提供了原子操作,可以在没有互斥锁的情况下对共享变量进行原子更新。使用原子操作的主要优势是它们通常比传统的互斥锁更高效,特别是对于像整数和指针这样的简单的原始数据类型的简单操作。

使用原子操作时不需要互斥锁,因为这些操作被设计为线程安全的,并且可以在不需要显式锁定和解锁互斥锁的情况下进行原子更新。原子操作在硬件级别上操作,确保操作的原子性,防止数据竞争,并避免传统锁定机制的需求。

然而,需要注意的是,原子操作也有其局限性。它们最适合用于对简单的、低级别的原始数据类型进行简单的更新。如果需要执行涉及多个变量或需要更复杂的同步的更复杂操作,则可能仍然需要使用互斥锁或其他同步原语。

总之,虽然原子操作可以在简单的原子更新共享变量的情况下不使用互斥锁,但是在选择原子操作和互斥锁之间取决于具体任务的需求和复杂性。根据并发代码的具体需求,选择合适的同步机制非常重要。

示例代码

package main

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

func main() {
 var counter int32

 // 创建一个 goroutine 来增加计数器的值。
 go func() {
  for i := 0; i < 5; i++ {
   atomic.AddInt32(&counter, 1)
   fmt.Printf("增加: %d\\n", atomic.LoadInt32(&counter))
   time.Sleep(time.Millisecond)
  }
 }()

 // 创建一个 goroutine 来减少计数器的值。
 go func() {
  for i := 0; i < 5; i++ {
   atomic.AddInt32(&counter, -1)
   fmt.Printf("减少: %d\\n", atomic.LoadInt32(&counter))
   time.Sleep(time.Millisecond)
  }
 }()

 // 等待 goroutine 结束。
 time.Sleep(2 * time.Second)

 fmt.Printf("最终值: %d\\n", atomic.LoadInt32(&counter))
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

运行以上示例代码,我们可以看到一个类型为 int32 的共享计数器变量。

创建了两个 goroutine,一个用于增加计数器的值,另一个用于减少计数器的值。我们使用 atomic.AddInt32 来原子地增加或减少计数器的值。我们使用 atomic.LoadInt32 来安全地加载计数器的值以供打印。程序使用 time.Sleep 等待 goroutine 结束。使用原子操作可以确保计数器在没有互斥锁的情况下安全地更新。你应该看到计数器在没有竞争的情况下正确地增加和减少。

该事件序列演示了操作的正确交错,最终计数器的值为 0。

这个输出证实了原子操作的工作方式,确保共享数据的安全性,而无需使用互斥锁进行同步。

结论

在 Go 中,原子操作是确保并发程序正确性和性能的重要工具。通过允许对共享内存进行安全操作,它们使开发人员能够编写高效可靠的并发代码。然而,在处理 Go 应用程序中的并发时,合理使用原子操作并了解潜在的权衡是非常重要的。通过对原子操作有着扎实的理解并正确使用,您可以构建健壮且响应迅速的并发程序。

风险提示:根据央行等部门发布“关于进一步防范和处置虚拟货币交易炒作风险的通知”,本网站内容仅用于信息分享,不对任何经营与投资行为进行推广与背书,请读者严格遵守所在地区法律法规,不参与任何非法金融行为。本文收集整理自网络,不代表经典网立场,如若转载,请注明出处:https://www.jingdian230.com/news/135062.html

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台用户上传并发布,本平台仅提供信息存储服务。

Special statement: The above contents (including pictures or videos, if any) are uploaded and released by users of the we-media platform. This platform only provides information storage services.

(0)
欧易OKX

欧易OKX

               

欧易OKx是全球三大比特币交易所之一,注册即开最高6万元盲盒,100%中奖!

           官网注册

相关推荐

  • 店家回应7人吃自助炫300多个螃蟹

    导读:店家回应7人吃自助炫300多个螃蟹,7人吃自助4小时炫300多个螃蟹l,7人吃自助炫300个螃蟹@@,7人吃自助炫了300多只螃蟹,自助餐的螃蟹,7人吃自助炫300多螃蟹,餐…

    2023年 5月 6日
    164
  • 中纪委通报3名“内鬼”同日被查

    导读:中纪委通报3名“内鬼”同日被查,中国纪检监察报,中国纪检监察 据决策杂志 8月25日,中央纪委国家监委网站发布消息,多名纪委“内鬼”被查。     河南警…

    2023年 8月 27日
    158
  • 23年没来往的继子获得天降遗产

    导读:23年没来往的继子获得天降遗产,天降十亿遗产,继子有继承遗产的权利吗,后妈的遗产可以继承吗,继子有权继承后爸的父母遗产,继子可以继承生父的遗产吗,儿子想继承10亿财产完整版,…

    2023年 5月 26日
    228
  • 警方通报山科大伤人案:1死6伤

    2023年4月19日17时许,山东科技大学(青岛校区)北门外东侧人行道上发生一起持刀伤人案件,造成7人受伤,其中一人经抢救无效死亡,其他伤者无生命危险。案件发生后,公安机关迅速出警…

    2023年 4月 20日
    150
  • 医院收费人员被拍到边打游戏边工作

    导读:医院收费人员被拍到边打游戏边工作,医院收费员能入编吗,医院可以拍工作人员视频吗,医院收费标准,医护人员在医院被打了,医院收费的叫什么岗位,医院收费处有监控吗,在医院大厅遇到病…

    2023年 12月 7日
    210
  • 就业突围:回农村的毕业生

    导读:就业突围:回农村的毕业生,大学生毕业后回乡发展,大学生回归农村,大学生毕业到村,大学生毕业到农村工作,农村大学生现状,大学生回农村创业,农村大学生毕业后回农村,房农村毕业生,…

    2023年 7月 24日
    111
  • 西方臻选主播疑似模仿董宇辉 !抖音:账号涉及仿冒假冒,平台已将账号封禁 !

    据报道:12月17日,一个名为“西方臻选”的直播间引发网友关注,因主播风格与董宇辉类似,被网友质疑主播在模仿董宇辉。据直播画面显示当时有超4万人在线观看,直播历史记录显示共有85.…

    2023年 12月 19日
    110
  • 特斯拉市值一夜大涨5944亿

    导读:特斯拉市值一夜大涨5944亿,特斯拉股价暴涨原因,特斯拉裁员背后的原因,特斯拉市值增加超500亿美元热,特斯拉市值飙升近六千亿热,特斯拉市值暴涨热,特斯拉股价走势,特斯拉首席…

    2024年 4月 30日
    28
  • 今年高考报名人数1291万创历史新高

    导读:今年高考报名人数1291万创历史新高,今年高考生多少人2023,今年高考生人数,山东高考人数,全国高考报名人数,2021年高考报名人数,2021年全国高考录取多少人,多地20…

    热点新闻 2023年 6月 1日
    122
  • 欧易OKX

    欧易OKX

                   

    欧易OKx是全球三大比特币交易所之一,注册即开最高6万元盲盒,100%中奖!

               官网注册
  • 业主:为了卖房 我被中介“pua”了

    导读:业主:为了卖房 我被中介“pua”了,卖房中介,卖房被中介压价怎么办,中介卖房的套路你应该都知道,业主卖房被骗,卖房被中介全款收房,房产中介卖房子的套路,卖房子双方都要中介费…

    2023年 6月 5日
    217