golang sudog是什么?

sudog代表在等待队列中的goroutine,比如channel发送接受。由于goroutine和同步对象的关系是多对多,因此需要sudog映射

type sudog struct {// 指向的goroutineg *g// 指向前后sudog的指针next *sudogprev *sudog// 指向数据elem unsafe.Pointer // data element (may point to stack)// The following fields are never accessed concurrently.// For channels, waitlink is only accessed by g.// For semaphores, all fields (including the ones above)// are only accessed when holding a semaRoot lock.// 获取时间acquiretime int64// 释放时间releasetime int64// 作为队列元素的标识ticket      uint32// isSelect indicates g is participating in a select, so// g.selectDone must be CAS'd to win the wake-up race.isSelect bool// success indicates whether communication over channel c// succeeded. It is true if the goroutine was awoken because a// value was delivered over channel c, and false if awoken// because c was closed.success boolparent   *sudog // semaRoot binary treewaitlink *sudog // g.waiting list or semaRootwaittail *sudog // semaRootc        *hchan // channel
}

acquireSudog()

func acquireSudog() *sudog {// 增加m的锁,防止垃圾回收在此期间被调用mp := acquirem()pp := mp.p.ptr()// 如果本地缓存为空if len(pp.sudogcache) == 0 {lock(&sched.sudoglock)// 从中心缓存迁移至多一半本地缓存容量的缓存项到本地缓存for len(pp.sudogcache) < cap(pp.sudogcache)/2 && sched.sudogcache != nil {s := sched.sudogcachesched.sudogcache = s.nexts.next = nilpp.sudogcache = append(pp.sudogcache, s)}unlock(&sched.sudoglock)// 若本地缓存仍为空,则新建缓存项if len(pp.sudogcache) == 0 {pp.sudogcache = append(pp.sudogcache, new(sudog))}}// 从本地缓存中取出最后一个缓存项返回n := len(pp.sudogcache)s := pp.sudogcache[n-1]pp.sudogcache[n-1] = nilpp.sudogcache = pp.sudogcache[:n-1]if s.elem != nil {throw("acquireSudog: found s.elem != nil in cache")}// 减少m的锁,允许垃圾回收调用releasem(mp)return s
}

releaseSudog()

func releaseSudog(s *sudog) {// 判断sudog各项数据、状态是否正确if s.elem != nil {throw("runtime: sudog with non-nil elem")}if s.isSelect {throw("runtime: sudog with non-false isSelect")}if s.next != nil {throw("runtime: sudog with non-nil next")}if s.prev != nil {throw("runtime: sudog with non-nil prev")}if s.waitlink != nil {throw("runtime: sudog with non-nil waitlink")}if s.c != nil {throw("runtime: sudog with non-nil c")}gp := getg()if gp.param != nil {throw("runtime: releaseSudog with non-nil gp.param")}mp := acquirem() // avoid rescheduling to another Ppp := mp.p.ptr()// 如果本地缓存满了,就迁移至多一半容量缓存项到中心缓存if len(pp.sudogcache) == cap(pp.sudogcache) {// Transfer half of local cache to the central cache.var first, last *sudogfor len(pp.sudogcache) > cap(pp.sudogcache)/2 {n := len(pp.sudogcache)p := pp.sudogcache[n-1]pp.sudogcache[n-1] = nilpp.sudogcache = pp.sudogcache[:n-1]if first == nil {first = p} else {last.next = p}last = p}lock(&sched.sudoglock)// 将迁移出来的本地缓存链表直接挂到中心缓存中last.next = sched.sudogcachesched.sudogcache = firstunlock(&sched.sudoglock)}// 将释放的sudog添加到本地缓存pp.sudogcache = append(pp.sudogcache, s)releasem(mp)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】顺序表详解

目录 &#xff08;一&#xff09;顺序表是一种数据结构 &#xff08;二&#xff09;顺序表 &#xff08;1&#xff09;顺序表的必要性 &#xff08;2&#xff09;顺序表的概念及结构 i&#xff0c;线性表 &#xff08;3&#xff09;顺序表的分类 i&#xff0c;顺序表和…

Android SELinux:保护您的移动设备安全的关键

Android SELinux&#xff1a;保护您的移动设备安全的关键 1 引言 移动设备在我们的生活中扮演着越来越重要的角色&#xff0c;我们几乎把所有重要的信息都存储在这些设备上。然而&#xff0c;随着移动应用程序的数量不断增加&#xff0c;安全性也变得越来越关键。这就是为什么…

海洋鱼类检测7种YOLOV8NANO

【免费】海洋鱼类检测&#xff0c;7种类型&#xff0c;YOLOV8训练&#xff0c;转换成ONNX&#xff0c;OPENCV调用资源-CSDN文库 采用YOLOV8NANO训练模型&#xff0c;得到PT模型&#xff0c;然后转换成ONNX&#xff0c;供OPENCV的DNN调用&#xff0c;摆脱PYTORCH依赖&#xff0c…

SQL中聚合函数

SQL中的聚合函数是用于对一组值执行计算&#xff0c;并返回单个值的函数。它们通常在SELECT语句的SELECT列表中使用&#xff0c;并与GROUP BY子句结合使用来汇总数据。聚合函数忽略NULL值&#xff0c;只对非NULL值进行计算。以下是一些最常用的SQL聚合函数&#xff1a; 1. COU…

基于python的新闻爬虫

咱们这个任务啊&#xff0c;就是要从一个指定的网站上&#xff0c;抓取新闻内容&#xff0c;然后把它们整整齐齐地保存到本地。具体来说&#xff0c;就是要去光明网的板块里&#xff0c;瞅瞅里面的新闻&#xff0c;把它们一条条地保存下来。 首先&#xff0c;咱得有个网址&…

[python] os.waitpid

os.waitpid() 是 Python 中用于等待子进程改变状态的函数。这个函数是 os 模块的一部分&#xff0c;它提供了一个方式来收集子进程的状态信息&#xff0c;或者等待子进程结束。os.waitpid() 函数是 Unix/Linux 系统上的系统调用 waitpid() 的封装。 使用 os.waitpid() os.wai…

算法设计与分析实验:最短路径算法

一、网络延迟时间 力扣第743题 本题采用最短路径的思想进行求解 1.1 具体思路 &#xff08;1&#xff09;使用邻接表表示有向图&#xff1a;首先&#xff0c;我们可以使用邻接表来表示有向图。邻接表是一种数据结构&#xff0c;用于表示图中顶点的相邻关系。在这个问题中&am…

轻松打造智能化性能测试监控平台:【JMeter+Grafana+Influxdb】的优化整合方案

在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系统、应…

基于机器学习的无损缺陷检测技术研究进展

基于机器学习的无损缺陷检测技术是当前研究的热点之一&#xff0c;其应用广泛&#xff0c;可以有效检测各种材料表面的缺陷。近年来&#xff0c;随着机器学习技术的不断发展&#xff0c;越来越多的研究人员开始探索如何利用机器学习算法来进行无损缺陷检测。 机器学习算法在无…

C语言·贪吃蛇游戏(下)

上节我们将要完成贪吃蛇游戏所需的前置知识都学完了&#xff0c;那么这节我们就开始动手写代码了 1. 程序规划 首先我们应该规划好我们的代码文件&#xff0c;设置3个文件&#xff1a;snack.h 用来声明游戏中实现各种功能的函数&#xff0c;snack.c 用来实现函数&#xff0c;t…

探索Web3.0:下一代互联网的新篇章

随着技术的不断演进和社会的持续发展&#xff0c;我们正逐渐迈入Web3.0时代。Web3.0&#xff0c;作为下一代互联网的代名词&#xff0c;不仅仅是技术的进步&#xff0c;更是一种全新的数字化生态系统&#xff0c;其所带来的影响将深刻地改变着我们的生活、工作和交流方式。 什…

Java二维码图片识别

前言 后端识别二维码图片 代码 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing<…

tuya-open-sdk-for-device使用体验之Windows 下 MSYS2 编译 T2-U 开发板

tuya-open-sdk-for-device 是一款跨芯片平台、操作系统的 IoT 开发框架。它基于通用南向接口设计&#xff0c;支持 Bluetooth、Wi-Fi、Ethernet 等通信协议&#xff0c;提供了物联网开发的核心功能&#xff0c;包括配网&#xff0c;激活&#xff0c;控制&#xff0c;升级等&…

2024美赛A题完整思路代码分析:建立竞争机理方程+遗传算法优化

A题是自由度比较大的场景限定下的模型构建&#xff0c;相对比较容易&#xff0c;核心是找到现有的成熟的数学模型&#xff0c;然后找到合适的数据进行证明得到结论&#xff0c;估计大部分是目标优化问题。&#xff08;不限制专业&#xff09; B题属于较为经典的物理建模&#…

【竞技宝】LOL:Able小炮连续起跳收割战场 OMG2-0轻取TT

北京时间2024年2月2日&#xff0c;英雄联盟LPL2024春季赛在昨天迎来第二周第四个比赛日&#xff0c;本日首场比赛由TT对阵OMG。本场比赛&#xff0c;TT在前中期和OMG有来有回&#xff0c;然而中后期的大龙团战始终不是OMG的对手&#xff0c;最终OMG2-0轻取TT。以下是本场比赛的…

linux vim 异常退出 异常处理 交换文件

交换文件 *.swp 格式 同时是隐藏的 如在vim一个文件&#xff0c; 在没有正常退出&#xff0c; 如直接断开连接 在次编辑这个文件 会出现下图的错误 解决方案&#xff1a; 直接删除这个交换文件即可 rm -fr .zen.txt.swp

11.29 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 比亚迪2024届秋招补录&#xff0c;内推码来袭&#xff01;&#xff08;上&#xff09; 校招 | 比亚迪2024届秋招补录&#xff0c;内推码来袭&#xff01;&#xff08;上&#xff0…

唐墓惊现石椁,文物预防性保护系统未雨绸缪

一、文物保护的急需解决和科技的支持 陕西省考古学会近日宣布&#xff0c;考古团队在西安揭开了唐睿宗李旦孙媳妇薛柔顺墓的神秘面纱&#xff0c;其中出土的一具完整石椁&#xff0c;雕刻精湛、线条流畅&#xff0c;实属罕见珍宝。唐代石椁本就稀少&#xff0c;此次发现更是为…

RK3588开发板Ubuntu与开发板使用U盘互传

1 将 U 盘(U 盘的格式必须为 FAT32 格式&#xff0c;大小在 32G 以下)插到开发板的 usb 接口&#xff0c;串口打印信息如下所示&#xff0c;U 盘的设备节点是/dev/sdb4。U 盘的设备节点不是固定的&#xff0c;根据实际情况来查看设备节点。 2 输入以下命令挂载 U 盘&#xff0c…

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 哈希表实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int&g…