Ответ 1
Просто судя по простым аргументам std::async
, похоже, нет способа контролировать выделение внутреннего std::promise
, и это поэтому можно просто использовать что-либо, хотя вероятно, std::allocator
. Хотя я предполагаю, что в теории это не указано, вероятно, разделяемое состояние выделено внутри вызывающего потока. Я не нашел никакой явной информации в стандарте по этому вопросу. В конце std::async
- очень специализированное средство для легкого асинхронного вызова, поэтому вам не нужно думать, действительно ли a std::promise
.
Для более прямого контроля за поведением асинхронного вызова также существует std::packaged_task
, который действительно имеет аргумент распределителя. Но из простой стандартной цитаты не совсем понятно, используется ли этот распределитель для распределения памяти для функции (поскольку std::packaged_task
является видом специального std::function
) или если он также используется для распределения общего состояния внутренний std::promise
, хотя кажется вероятным:
30.6.9.1 [futures.task.members]:
Эффекты: создает новый объект
packaged_task
с общим состоянием и инициализирует хранимую задачу объектов с помощьюstd::forward<F>(f)
. конструкторы, которые принимают аргументAllocator
, используют его для выделения памяти необходимых для хранения внутренних структур данных.
Ну, он даже не говорит о том, что a std::promise
внизу (аналогично для std::async
), это может быть просто тип undefined, подключаемый к std::future
.
Итак, если действительно не указано, как std::packaged_task
выделяет свое внутреннее разделяемое состояние, лучшим вариантом может быть реализация ваших собственных возможностей для вызова асинхронных функций. Учитывая, что, просто говоря, a std::packaged_task
- это просто std::function
, связанный с std::promise
и std::async
, просто запускает std::packaged_task
в новом потоке (ну, если только это не так), это shouldn ' t быть слишком большой проблемой.
Но на самом деле это может быть недосмотр в спецификации. В то время как управление распределением не подходит для std::async
, объяснение std::packaged_task
и его использование распределителей может быть немного яснее. Но это также может быть преднамеренным, поэтому std::packaged_task
может свободно использовать все, что захочет, и даже не нуждается в std::promise
внутри.
EDIT: Снова прочитав его, я думаю, что приведенная выше стандартная цитата действительно говорит, что std::packaged_task
разделяемое состояние выделено с помощью предоставленного распределителя, поскольку оно является частью из "внутренних структур данных", независимо от того, что (там не обязательно должно быть фактическое std::promise
). Поэтому я думаю, что std::packaged_task
должно быть достаточно для явного управления общим состоянием асинхронной задачи std::future
.