# 其他异步功能

# 暂停任务

// 暂停 10 秒
co_await fv::Tasks::Delay (std::chrono::seconds (10));

# 外部需要用到 io_context

fv::IoContext &_ctx = fv::Tasks::GetContext ();

# 异步锁

异步锁是一款适用于异步的锁。相对于标准库的 std::mutex 来说,有以下特性:

  • 支持异步等待加锁
  • 加锁与解锁不要求同一线程

创建锁:

fv::AsyncMutex _mtx {}; // 参数传 true 代表初始化时加锁

加锁:

// 尝试加锁
bool _locked = _mtx.TryLock ();

// 异步加锁
co_await _mtx.Lock ();

// 异步超时锁
bool _locked = co_await _mtx.Lock (std::chrono::seconds (1));

解锁:

_mtx.Unlock ();

获知是否已锁:

bool _locked = _mtx.IsLocked ();

# 异步信号量

异步信号量是一款适用于异步的信号量。相对于标准库的 std::counting_semaphore 来说,有以下特性:

  • 支持异步等待获取

创建信号量:

fv::AsyncSemaphore _sema { 1 }; // 参数代表初始资源数

获取资源:

// 尝试获取资源
bool _acq = _sema.TryAcquire ();

// 异步获取资源
co_await _mtx.Acquire ();

// 异步超时获取资源
bool _acq = co_await _mtx.Acquire (std::chrono::seconds (1));

释放资源:

_mtx.Release ();

获知现有资源数:

size_t _count = _mtx.GetResCount ();

# 示例

TODO