信号量
导入 <asco/sync/semaphore.h>
头文件使用信号量。
二值信号量( asco::binary_semaphore
)
二值信号量仅有两种状态,表示此信号量控制的资源存在(计数为1)或不存在(计数为0)。
构造
必须为二值信号量指定一个初始值:
binary_semaphore sem{0};
获取信号量
future_void_inline acquire()
此函数是一个内联协程,需要通过 co_await
唤起执行。
acquire
函数行为:
当信号量计数为1
时,将信号量计数设置为0
,并返回。
当信号量计数为0
时,挂起当前协程,将当前协程加入信号量的等待队列,并挂起。
此协程是可打断协程,在函数返回前被打断时,不会将信号量计数设置为0
。
尝试获取信号量
bool try_acquire()
当信号量计数为1
时,将信号量计数设置为0
,并返回true
。
当信号量计数为0
时,返回false
。
释放信号量
void release()
release
函数行为:
当信号量计数为0
时,将信号量计数设置为1
,从等待队列中唤醒一个协程,并返回。
当信号量计数为1
时,什么都不做,直接返回。
计数信号量( asco::semaphore<N>
)
表示此信号量控制的资源有 N
个。
依然使用 acquire
获取信号量,使用 release
释放信号量。
release
有一个参数,表示资源的释放数量,这个参数具有默认值1
,或传入指定的值,不可传入非正整数:
sem.release(2);