Завершение вызова функции происходит-раньше успешного возврата из функций 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.
Нет.