sv通信-sv绿皮书7.5semphore
资料来源
(1)sv绿皮书;
(2)硅芯思见:【127】semaphore原来还有这一面 (qq.com)
1.旗语semphore简介
(1)semaphore是SystemVerilog中的内建类,主要用于实现多进程对于共享资源的协同访问控制。
(2)semaphore的基本操作:new(),get(),put(),try_get()。
(3)semaphore示例
2.semaphore基本操作的特殊用法
2.1new
(1) semaphore_name=new(number_of_keys);其中,number_of_keys是创建semaphore存储桶中包含的初始key的数目,可以不指定,默认值为0,说明此时声明的semaphore句柄指向的存储空间中没有key可用,但并不意味着此时没有为semaphore句柄分配空间;
(2) 使用示例
2.2get()
(1) semaphore.get(number_of_keys)或semaphore_name.get();如果没有指定number_of_keys,那么get()方法默认需要获取的key数目为1。
(2) 如果在get时,存储桶里有足够多的key可供获取,那么方法将返回并且程序继续执行;
(3) 如果在get时,存储桶里没有足够多的key可供获取,但是key的总量大于要get的数量,那么进程将被阻塞;
(4) 如果在get时,存储桶里没有存放满足get()要求数目的key,key的总量小于要get的数量,那么进程也不会被阻塞,而是会认为该任务不能完成并提前结束;所以,在使用semaphore的get()任务时,需要保证semaphore中存放了满足get()要求数目的key;
(5) 与(4)对应的示例:
2.3put()
(1) semaphore_name.put(number_of_keys)或semaphore_name.put();
(2) 当put被调用时,会返回给存储桶指定数目的key;如果方法调用时,不指定key的数目,默认返回1个key;
(3) put返回存储桶的key的数目可以比其get到的key的数目多;
(4) 与(3)对应的示例:
(5) 在没有使用get(key_number)的情况下,也可以使用put向存储桶返回特定数目的key;
(6) 如果semaphore在创建对象时,不指定初始化key的数目,可以在后续使用过程中通过put方法向semaphore存储桶中放入key从而间接实现存储桶key的初始化;
2.4try_get()
(1) semaphore_name.try_get(number_of_keys)或semaphore_name.try_get();
(2) try_get函数与get任务的不同点在于:get()方法会阻塞其后程序的执行并且在获取不到期望数目的key时会提前退出当前进程,而try_get()函数如果semaphore存储桶中有足够的key,则会获取到对应数目的key,并返回1,程序继续执行,当获取不到期望数目的key时,try_get()函数会返回0,并且不会阻塞进程的继续执行;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?