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