资料来源
(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可供获取,那么进程将被阻塞;
(4) 如果在get时,存储桶里没有存放满足get()要求数目的key,那么进程也不会被阻塞,而是会认为该任务不能完成并提前结束;所以,在使用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,并且不会阻塞进程的继续执行;