LINUX.ORG.RU

Дождаться std::future асинхронно

 ,


0

4

Sutter вот так в презентации советовал:

template<typename Fut, typename Work>
auto then(Fut f, Work w)->std::future<decltype(w(f.get()))>
  { return std::async([=] { w(f.get()); }); }
но на SO нашли пару недостатков. Собственно вопрос: разве нельзя в шаблон добавить std::launch::async и использовать shared_future? Или это портить обобщённость шаблона?

★★★★★

Ответ на: комментарий от anonymous

Что плохого в std::async? Косяк в нем конечно есть и довольно большой, это правда. Но если забыть о std::launch::deferred, то очень крутая штука.

Dudraug ★★★★★
()
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Это я прочитал. Посмотрев на альтернативу, я не сказал бы, что shared было бы уж такое большое зло. Или я что-то упускаю?

UVV ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

(since C++14)

Кстати, верное направление. Добавляет ясности, чтобы потом не слышать вокруг про то, что async УГ.

UVV ★★★★★
() автор топика
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от UVV

Оно и раньше таким было. Почитай всю историю о косяках std::async. Просто по с++11 все было ок, но потом обнаружились проблемы и в стандарт добавили это. Почитай о поведение деструктора std::future который генерится std::async, там весело.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Почитай о поведение деструктора std::future который генерится std::async, там весело

Это в случае deferred или всегда? В смысле ссылка есть, где почитать?

UVV ★★★★★
() автор топика
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от UVV

Ага, в этом случае. Слишком разное поведение. Да и с мьютексами там ньюансы будут. Я бы вообще про deferred забыл. Жаль конечно, что такие косяки есть в modern c++, но все же.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Я бы вообще про deferred забыл

А, ну тогда понятно. Я его не собирался использовать. Если честно, даже не представляю зачем он может понадобиться, поскольку он идёт вразрез с тем, что понимают под async.

UVV ★★★★★
() автор топика
Ответ на: комментарий от Uter

Эта песня из той же оперы, что и deferred

UVV ★★★★★
() автор топика

Вот смотрю я на эти треды и в очередной раз откладываю плюсы на будущее. Task-based подход меня особо возбуждал с некоторого времени, однако получить какое-либо мнение бывалых товарищей по данному вопросу мне так и не удалось, только отзывы в духе «не готово».

anonymous
()
Ответ на: комментарий от anonymous

А есть вариант с task-based скажем с boost. В принципе код выше с launch::async и shared_future работает вроде..

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Ну там надо помнить еще одну деталь. На сколько я помню стандарт не гарантирует новый тред для каждой future. На винде например треды точно беруться из пула, что вроде и ок - рантайму и ос виднее как лучше. Но(!) это означает, что надо забыть о thread_local.

Dudraug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.