当前位置: 首页 > news >正文

深入理解Go 语言信号量 Semaphore

1. 什么是信号量

信号量的概念是荷兰计算机科学家

1.1 P/V 操作

Dijkstra 在他的论文中为信号量定义了两个操作 : P 和 V 。

1.2 信号量和互斥锁的区别与联系

信号量有两种类型:二元信号量和计数信号量。

2. 信号量的 channel 实现

程序在运行时,Go 内部使用信号量来控制 goroutine 的阻塞和唤醒。

3. Go 官方的信号量实现

虽然在 Go 标准库中并没有实现信号量,但是在 Go 官方的扩展库中却实现了一个带

4. 使用信号量的常见错误

        保证信号量不出错的前提是正确地使用它;否则,公平性和安全性就会受到损害,导致程序发生 panic。

        在使用信号量时,最常见的几个错误如下:

  • 请求了资源,但是忘记了释放它。
  • 释放了从未请求的资源。
  • 长时间持有一个资源(即使不需要它)。
  • 不持有资源,却直接使用它。

        就 Go 扩展库实现的信号量来说,在调用 Release 方法时,可以传递任意的整数。但是,如果传递一个参数,这个参数的值比全部能释放的资源的值还大,程序就会发生 panic。如果传递一个负数,则会导致资源永久被持有。如果所请求的资源数量大于最大资源数量,那么调用者可能永远被阻塞。

        所以,使用信号量遵循的原则就是请求多少资源,就释放多少资源。一定要注意,必须使用正确的方法传递整数,不要耍小聪明,而且,请求的资源数量一定不要超过最大资源数量。

 

 

http://www.lryc.cn/news/415924.html

相关文章:

  • VisualStudio2019下载与安装
  • 李宏毅老师机器学习常见英语词汇
  • 人工智能时代,程序员如何保持核心竞争力?
  • WiFi to Ethernet: 树莓派共享无线连接至有线网口,自动通过Captive Poartal网页登录认证
  • 【神软大数据治理平台-高级动态SQL(接口开发)】
  • 【Java数据结构】Map和Set超详细两万字讲解(内含搜索树+哈希表)
  • 中国制造2025,会抛弃精益生产吗?
  • Rust 循环
  • 数据结构(其四)--特殊矩阵的存储
  • 系统化学习 H264视频编码(06)哥伦布编码
  • 手机在网状态接口如何对接?(一)
  • 数据结构链表2(常考习题1)(C语言)
  • Rust的运行时多态
  • sqllabs通关
  • RTSP系列四:RTSP Server/Client实战项目
  • sqli-labs-php7-master第11-16关
  • c++初阶 string的底层实现
  • 微信小程序实现上传照片功能
  • lombok安装成功但是找不到方法
  • 单细胞Seurat的umi矩阵-与feature、counts(用于质控)
  • 安防视频监控EasyCVR视频汇聚平台设备发送了GPS位置,但是订阅轨迹为空是什么原因?
  • 在 VueJS 中使用事件委托处理点击事件(事件委托,vue事件委托,什么是事件委托,什么是vue的事件委托)
  • 密码学简史:时间密语
  • 【Java数据结构】---初始数据结构
  • MySQL--主从复制
  • Linux RT调度器之负载均衡
  • pwn学习笔记(8)--初识Pwn沙箱
  • Day18_2--Vue.js Ajax(使用 Axios)基础入门学习
  • windows11远程桌面如何打开
  • qt代码显示,包含文本颜色设置等