Semaphore旗语

Semaphore在SystemVerilog(SV)中用于管理共享资源的互斥访问,类似于钥匙管理。通过new()创建Semaphore,get()获取钥匙,put()归还钥匙,try_get()尝试无阻塞获取。Semaphore的get()和put()操作遵循先进先出原则,但在多钥匙情况下可能会有优先级反转。示例展示了如何初始化和操作Semaphore。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Semaphore在SV语言中,一般被翻译为旗语。使用Semaphore可以实现对共享资源的互斥访问。Semaphore类似于一把钥匙,只有请求方获得钥匙才能访问资源,在访问完成后返回钥匙,其他的请求方才可以使用。

创建semaphore:
semaphore smTx;
semaphore是一个内建的类,它提供了下列方法:

• 产生一个具有指定数目键值的semaphore:new()

New()方法用来产生 semaphore。原型如下:
function new(int keyCount = 0);
KeyCount指定了最初被分配到semaphore桶中的键值的数目,KeyCount的缺省值为0。
new()函数返回semaphore的句柄,如果没有产生semaphore则返回null
注:keyCount指定的是初始键值的数目,而不是上限。

• 从桶中获取一个或多个键值:get()

get()方法被用来从一个semaphore中获得指定数目的键值。原型如下:
task get(int keyCount = 1);
keyCount指定了需要从semaphore中获得的键值的数目,它的缺省值为1。
如果桶内没有足够数量的键值,会一直阻塞,直到put进足够的数目的键值为止。
如果有多个线程使用get()获取键值,多个阻塞的线程会会以先进先出(FIFO)的方式进行排队。但不一定按标准的FIFO方式进行,在带有多个钥匙的旗语中,如果仅剩下一把钥匙,线程A先来请求2把钥匙,而线程B后来请求一把钥匙,那线程B会排到线程A前优先出队,所以有多个大小不同的请求混用的情况下,建议自行编写一个类,这样对于线程之间的优先级会比较清楚。

• 向桶中返回一个或多个键值:put()

put()方法被用来将键值返回到一个semaphore中。 原型如下:
task put(int keyCount = 1);
keyCount指定了返回到semaphore中的键值的数目,它的缺省值为1。
注:一个线程不一定非要先get再put,put回去键值的数目,也可以比get的多。正常可能不会这么用,但是SV语法支持这样的操作。
• 尝试无阻塞地获取一个或多个键值:try_get()

try_get()方法被用来无阻塞地从一个semaphore中获得指定数目的键值。 原型如下:
function int try_get(int keyCount = 1);
keyCount指定了需要从semaphore中获得的键值的数目,它的缺省值为1。
如果桶内键值数目足够,那么try_get()方法返回1,并从桶内获取指定数量的键值;如果桶内的键值数目不够,那么try_get()方法返回0,并不对桶进行操作。

semaphore sem;
sem = new(1);
sem.get(1);
......
sem.put(1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值