Результат
Конструирует копии func
и args...
во внутренней памяти (далее обозначаются fff
и xyz...
соответственно).
Если policy
равно std::launch::async
, то вызывает функцию INVOKE(fff, xyz...)
в отдельном потоке. Возвращенный объект std::future
становится готов , когда этот поток завершится, и будет содержать либо возвращенное функцией значение, либо возбужденное ей исключение. Деструктор последнего будущего объекта, ассоциированного с асинхронным состоянием возвращенного объекта std::future
, блокирует поток, пока будущий результат не будет готов .
Если policy
равно std::launch::deferred
, то fff
и xyz...
сохраняются в возвращенном объекте std::future
как отложенный вызов функции. При первом обращении к функции-члену wait()
или get()
будущего результата, который разделяет то же самое ассоциированное состояние, функция INVOKE(fff, xyz...)
синхронно вызывается в потоке, который обратился к wait()
или get()
.
В ответ на вызов функции get()
этого объекта std::future
либо возвращается значение, полученное от INVOKE(fff, xyz...)
, либо возбуждается исключение, которое имело место в этой функции.
Если policy
равно std::launch::async | std::launch::deferred
или аргумент policy
опущен, то поведение такое же, как если бы была задана политика std::launch::async
или std::launch::deferred
. Реализация сама выбирает нужное поведение при каждом вызове, чтобы в максимальной степени задействовать доступный аппаратный параллелизм, не вызывая при этом превышения лимита.
В любом случае функция std::async
возвращает управление немедленно.
Синхронизация
Завершение вызова функции происходит-раньше успешного возврата из функций 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...
.
В заголовке объявлены средства, обеспечивающие взаимное исключение: типы мьютексов и блокировок, различные функции и механизм, гарантирующий, что некая операция выполнена ровно один раз.
Содержимое заголовка
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...);
}
Класс 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
.
Постусловия
Читать дальше