Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

信号量

导入 <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);