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;
}
Другие вопросы по тегам