Semaphore就是類似有一個盒子裡面放了固定數量的key,想要往下執行的時候要先去get一把key,有成功拿到key之後才能往下執行,沒拿到key就繼續等待到有key之後再往下執行。
使用方式new()的時候決定key的數量get(keyCount)取得key,參數就是要取得key的數量put(keyCount)取得key,參數就是要放回key的數量
也可以用try_get(keyCount)來嘗試取得key,取得key失敗就不會被block住
下面的例子是semaphore只有一把key,customerA和customerB在getRoom之前需要先去get() key,成功得到key之後一段時間就會把key用put()放回去,參數id其實只是個記號而已
Example:
1 | module tb(); |
Output
# run 10000
# t:0 start get room id:1
# t:0 finish get room id:1
# t:0 start get room id:2
# t:5 start return room id:1
# t:5 finish return room id:1
# t:5 finish get room id:2
# t:15 start return room id:2
# t:15 finish return room id:2
# quit -f
這個例子因為只有一把Key,所以customerB必須等到customerA把key還回去之後,才能夠得到room並往下執行。
如果把上面的範例的key在new的時候改成兩把key的話,結果如下:
Example:
1 | module tb(); |
Output
# run 10000
# t:0 start get room id:1
# t:0 finish get room id:1
# t:0 start get room id:2
# t:0 finish get room id:2
# t:5 start return room id:1
# t:5 finish return room id:1
# t:10 start return room id:2
# t:10 finish return room id:2
# quit -f
因為key有兩把,所以A和B都會直接get到key然後往下執行。