std :: future <> :: get очищает результат - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть многопоточная функция, которая возвращает внешний IP-адрес, и подумал, что могу использовать его с std::future:

std::future<std::string> GetIP4;
GetIP4 = std::async([]() -> std::string
    {
        return GetWanIP();
    });

Когда позже в коде я вызываю GetIP4.get(), я получаю std::string. Однако это очищает объект, поэтому в следующий раз, когда я пытаюсь вызвать get из другого потока, происходит сбой.

Это предполагаемое поведение std::future<>::get()? Это сценарий "У меня есть только один раз"? Я ничего не нашел в документации .

1 Ответ

5 голосов
/ 20 февраля 2020

Из cppreference на std::future<T>::get:

Любое общее состояние освобождается. valid() равно false после вызова этого метода.

И непосредственно перед этим упоминается, что

Поведение не определено, если valid() равно false до вызов этой функции.

Поскольку valid() должно быть true для вызова get(), а get() заставляет valid() стать false, то невозможно get() один и тот же future результат более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...