std::promise
имеет конструктор который выделяет память, используемую для хранения общего состояния. В реализации .then
, который я видел до сих пор, один хранит функцию в стертой манере, похожей на std::function
в общее состояние. совпадение Библиотека Stlab даже заходит так далеко, чтобы положить
using then_t = std::vector<std::pair<executor_t, task<void()>>>;
в общее состояние (чтобы включить расщепляемые фьючерсы).
Есть ли намерение указать, можно ли указывать распределитель для продолжений?
В P0443R3 они говорят в 1.2.9 Свойства для настройки выделения памяти
Реализации исполнителя должны использовать предоставленный распределитель для выделения
любая память, необходимая для хранения представленного объекта функции.
Я думаю, что это только означает, что хранилище для агентов, представленных через execute
функции не указатель в std::future
Общее состояние.
Я изучил недавние предложения по фьючерсам или исполнителям, и я не смог ничего найти. Недавние статьи, кажется, в любом случае предпочитают ставить исполнителей в общее будущее. Если исполнитель будет иметь связанный пользовательский распределитель, следует ли это использовать?
Я чувствую, что скучаю по чему-то.
—
Редактировать: Я думал об этом больше и думаю, что могу понять, почему кто-то хотел бы оставить это неуказанным. Если исполнители когда-либо параметризуют фьючерсы, их общее состояние может схематически выглядеть следующим образом
template <typename Executor, typename T>
struct shared_state_t {
// some prevention from race condition, for example
std::atomic<unsigned> flags;
// some sort of exception or value representation, for example
std::variant<std::exception_ptr, T> maybe_value;
// some handle to continuation
continuation_t<Executor, T> continuation;
};
где continuation_t<Executor, T>
не нужно выделять память. Это может быть указатель на внутренний агент выполнения одного исполнителя Executor
или что-то вроде std::function<void(T&&)>
для другого исполнителя.
Задача ещё не решена.
Других решений пока нет …