码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • GO语言-什么是临界资源安全问题?


    临界资源安全问题

    临界资源:指并发编程中,可以被多个进程/线程/协程共同访问的资源。

    如果在并发编程中对临界资源的处理不当,往往会导致数据不一致的问题。

    火车站卖票问题demo,来演示临界资源安全问题

    实现3个售票口同时售票

    1. //车票余量
    2. var tickets = 5
    3. //定义同步等待组
    4. var wg sync.WaitGroup
    5. func main() {
    6. wg.Add(3)
    7. go saleTickets("1号售票口")
    8. go saleTickets("2号售票口")
    9. go saleTickets("3号售票口")
    10. wg.Wait()
    11. }
    12. func saleTickets(name string) {
    13. for {
    14. if tickets > 0 {
    15. fmt.Printf("车票剩余:%v, %v售出\n", tickets, name)
    16. tickets--
    17. } else {
    18. fmt.Println("车票已售罄...")
    19. wg.Done()
    20. break
    21. }
    22. }
    23. }

    我们的参数一共设置了5张车票,但是程序最后反馈售出了7张车票。这就是临界资源的安全问题。

    3个goroutine在某个时刻判断车票数量是否大于0的时候,这个时刻车票数量都是满足的。但是在执行接下来的售票操作时,其中一个goroutine的售票口先把票卖出去了,但是其他两个售票口已经通过了逻辑判断,也将票卖了出去。

    如何解决临界资源安全问题?

    1.大多数语言解决同步资源安全问题都是通过上锁的方式。某一时刻只能允许一个goroutine来访问这个共享数据。go语言中,可以借助sync包下的锁操作。

    2.在go语言的并发编程中有一句经典的话:不要以共享内存的方式去通信,而要以通信的方式去共享内存。Go语言鼓励使用channel将共享状态或共享状态的变化在各个goroutine之间传递,这样就可以像锁一样保证同一时刻只有一个goroutine访问共享状态。

     

  • 相关阅读:
    通过git bash激活虚拟环境遇到的问题
    C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.2 我的代码为什么无法运行
    模块引擎 Thymeleaf
    前后端分离项目,vue+uni-app+php+mysql教室预约系统设计与实现(H5移动项目)
    SOP作业指导书系统如何帮助厂家实现数字化转型
    X Spring File Storage实现文件上传与下载
    八股总结(六):Android基础:四大组件与UI控件
    GZ038 物联网应用开发赛题第5套
    美国ARC与延锋安全合作,推动汽车安全气囊技术新突破
    Modbus TCP转Profinet网关集中采集电源能耗数据到中控西门子1200plc
  • 原文地址:https://blog.csdn.net/qq522044637/article/details/125446306
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号