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 2021-12-29 21:51  知北游。。  阅读(830)  评论(0编辑  收藏  举报

导航