Завершение вызова функции происходит-раньше успешного возврата из функций wait()
, get()
, wait_for()
и wait_until()
любого экземпляра std::future
или std::shared_future
, который ссылается на то же ассоциированное состояние, что и объект std::future
, возвращенный функцией std::async
. Если policy
равно std::launch::async
, то завершение потока, в котором имел место вызов std::async
, также происходит-раньше успешного возврата из этих функций.
std::bad_alloc
, если не удалось выделить внутреннюю память или std::future_error
, если не удалось добиться желаемого эффекта, или исключение, возбужденное в ходе конструирования fff
или xyz...
.
D.5. Заголовок
В заголовке
объявлены средства, обеспечивающие взаимное исключение: типы мьютексов и блокировок, различные функции и механизм, гарантирующий, что некая операция выполнена ровно один раз.
namespace std {
class mutex;
class recursive_mutex;
class timed_mutex;
class recursive_timed_mutex;
struct adopt_lock_t;
struct defer_lock_t;
struct try_to_lock_t;
constexpr adopt_lock_t adopt_lock{};
constexpr defer_lock_t defer_lock{};
constexpr try_to_lock_t try_to_lock{};
template
class lock_guard;
template
class unique_lock;
template
void lock(LockableType1& m1, LockableType2& m2...);
template
int try_lock(LockableType1& m1, LockableType2& m2...);
struct once_flag;
template
void call_once(once_flag& flag, Callable func, Args args...);
}
D.5.1. Класс std::mutex
Класс std::mutex
предоставляет базовые средства взаимного исключения и синхронизации потоков, применяемые для защиты разделяемых данных. Перед тем как обращаться к данным, защищаемым мьютексом, этот мьютекс необходимо lock()
или try_lock()
. В любой момент времени удерживать мьютекс может только один поток; если другой поток попытается захватить тот же мьютекс, то функция try_lock()
вернет ошибку, а функция lock()
приостановит выполнение потока. Закончив операции над разделяемыми данными, поток должен вызвать функцию unlock()
, чтобы освободить мьютекс и дать другим потокам возможность захватить его.
Экземпляр std::mutex
удовлетворяет требованиям концепции Lockable
.
class mutex {
public:
mutex(mutex const&)=delete;
mutex& operator=(mutex const&)=delete;
constexpr mutex() noexcept;
~mutex();
void lock();
void unlock();
bool try_lock();
};
STD::MUTEX
, КОНСТРУКТОР ПО УМОЛЧАНИЮ
Конструирует объект std::mutex
.
constexpr mutex() noexcept;
Конструирует экземпляр std::mutex
.
Вновь сконструированный объект std::mutex
первоначально не захвачен.
Нет.
STD::MUTEX
, ДЕСТРУКТОР
Уничтожает объект std::mutex
.
~mutex();
Объект *this
не должен быть захвачен.
Уничтожает *this
.
Нет.
STD::MUTEX::LOCK
, ФУНКЦИЯ-ЧЛЕН
Захватывает объект std::mutex
для текущего потока.
void lock();
Вызывающий поток не должен удерживать мьютекс *this
.
Блокирует текущий поток, пока мьютекс *this
не будет захвачен.
*this
захвачен текущим потоком.
Исключение типа std::system_error
в случае ошибки.
STD::MUTEX::TRY_LOCK
, ФУНКЦИЯ-ЧЛЕН
Пытается захватить объект std::mutex
для текущего потока.
bool try_lock();
Вызывающий поток не должен удерживать мьютекс *this
.
Пытается захватить объект std::mutex
для текущего потока без блокирования.
true
, если вызывающий поток захватил мьютекс, иначе false
.
*this
захвачен вызывающим потоком, если функция вернула true
.
Нет.