# Another asynchronous functionality
# Sleep task
// Sleep 10 seconds
co_await fv::Tasks::Delay (std::chrono::seconds (10));
# If external needs io_context
fv::IoContext &_ctx = fv::Tasks::GetContext ();
# Asynchronous mutex
Asynchronous mutex is a mutex suitable for asynchronous environments. In contrast to std::mutex
, there are the following features:
- Supports asynchronous wait locking
- Locking and unlocking do not require the same thread
Create mutex
fv::AsyncMutex _mtx {}; // Pass the true argument to lock during initialization
Lock:
// try lock
bool _locked = _mtx.TryLock ();
// asynchronous lock
co_await _mtx.Lock ();
// asynchronous timeout lock
bool _locked = co_await _mtx.Lock (std::chrono::seconds (1));
Unlock:
_mtx.Unlock ();
To know if it is locked:
bool _locked = _mtx.IsLocked ();
# Asynchronous semaphore
An asynchronous semaphore is a semaphore suitable for asynchrony. In contrast to the library's std::counting_semaphore
, there are the following features:
- Supports asynchronous wait for acquire
Create semaphore:
fv::AsyncSemaphore _sema { 1 }; // Parameter means the initial number of resources
Acquire resources:
// try acquire resources
bool _acq = _sema.TryAcquire ();
// asynchronous acquire resources
co_await _mtx.Acquire ();
// asynchronous timeout acquire resources
bool _acq = co_await _mtx.Acquire (std::chrono::seconds (1));
Release resources:
_mtx.Release ();
Get the count of available resources:
size_t _count = _mtx.GetResCount ();
# Example
TODO