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,并且不会阻塞进程的继续执行;

posted on   知北游。。  阅读(868)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示