Подтвердить что ты не робот

В чем разница между будущим и shared_future?

В чем разница между future и shared_future?
В каких случаях мы должны использовать shared_future вместо future?

Я пытался найти хорошую документацию, которая будет противопоставлять эти две функции С++ 11, и я не мог найти ответ (как минимум, легко читаемый) в Интернете.

Это мое текущее понимание различий

  • future объект может быть запрошен только один раз для get().
  • shared_future может запрашиваться любое количество раз.

прецедент: Если несколько потоков зависят от результата асинхронной задачи, мы должны использовать shared_future. Если будущий объект нужно запрашивать несколько раз в одном и том же потоке, мы должны использовать вместо него shared_future.

Приветствуется любая дополнительная информация, gotchas или общие рекомендации...

4b9b3361

Ответ 1

Мотивация для этих двух будущих типов восходит к перемещению семантики, только типов перемещения и новой функции С++ 11 для возврата типов только для перемещения из обычных функций.

В С++ 98/03, если вы хотите вернуть тип из функции factory:

A
make_A()
{
    A a;
    // ...
    return a;
}

то A должно быть CopyConstructible. Тогда, совершенно новый в С++ 11, мы можем вернуть A, даже если это не CopyConstructible, ему нужно только MoveConstructible.

Но что произойдет, если вы попытаетесь выполнить make_A одновременно, скажем, используя фьючерсы. Разве это не было бы преступлением, если бы вы могли распараллелить make_A, если A есть CopyConstructible?! Вам придется отказаться от одной оптимизации, преследуя другую!

So future<R> требует R MoveConstructible. Но вы можете получить его только один раз, потому что вы переходите от сохраненного результата.

Но получение одинакового результата для нескольких потоков также является реальной потребностью. Поэтому shared_future<R> позволяет это, но требует R быть CopyConstructible.