std::future как параметр функции C++
Рассмотрим следующий код
void printPromised(std::future<int> f)
{
std::cout << f.get() << std::endl;
}
int main()
{
printPromised(std::async(std::launch::async, [](){ return 8; })); // This works
auto f = std::async(std::launch::async, [](){ return 8; });
printPromised(f); // This won't work
}
Он говорит: "Это удаленная функция". Это почему? Далее мне нужно пропустить (поделиться) такой же обещанный результат, который std::async
генерируется; нескольким пользователям. Это означает, что когда кто-то вызывает "получатель", мне нужно передать тот же результат (мне не нужно заново генерировать результат, используя std::async
если он уже сформирован) а также мне нужен механизм блокировки, который std::future::get
есть.
2 ответа
Там может быть только одно будущее. Вы не можете иметь несколько копий одного и того же будущего. Итак, вам нужно передать право собственности на будущее функции:
printPromised(std::move(f));
// ^^^^^^^^^^^^
Если вам действительно нужен общий доступ к будущему, вы можете создать shared_future
из обычного будущего, позвонив share()
функция-член; это ведет себя подобно общему указателю:
auto sf = std::async(std::launch::async, [](){ return 8; }).share();
Сейчас sf
можно скопировать, и все копии ожидают одинакового результата, т.е. wait()
вызовы на всех копиях могут блокироваться и будут синхронизироваться с подготовкой результата.
Это то, что я придумал после этой дискуссии.
#include <future>
typedef std::shared_future<int> SharedFutureInt;
struct Object
{
SharedFutureInt m_promised;
bool isAssigned;
Object() : isAssigned(false)
{
}
SharedFutureInt getObjects()
{
if (isAssigned)
{
return m_promised;
}
m_promised = std::async(std::launch::async, [](){ return 8; });
isAssigned = true;
return m_promised;
}
};
int main()
{
Object obj;
int a = obj.getObjects().get();
int b = obj.getObjects().get();
int c = obj.getObjects().get();
return 0;
}