Quando devo usar std :: async com sync as policy?

9

std :: async tem uma sobrecarga que usa uma política std :: launch como o primeiro argumento. Quando devo usar essa sobrecarga? Quais são as diferentes políticas disponíveis? (Eu acho que sync e async são as duas opções). Quando devo usar a política de sincronização? Como isso é diferente de executá-lo diretamente?

    
por balki 11.02.2012 в 12:23
fonte

1 resposta

5

Resumo de artigo muito útil que Jagannath vinculou e comenta os possíveis usos.

Existem três políticas de lançamento:

  • any : a biblioteca escolhe se gerar um thread a ou não
  • async : você pede explicitamente que um thread seja gerado
  • deferred : você pede explicitamente que um segmento não seja gerado

Portanto, a política deferred é uma maneira de obter avaliação preguiçosa determinística (também conhecida como chamada por necessidade). Por exemplo, suponha que você tenha:

void MyClass::lazy(std::future<int> const& f) {
  if (this->notReady()) { return; }
  if (this->stillNotReady()) { return; }
  if (this->value() == 42) { return; }

  this->go(f.get());
}

Agora, se calcular o valor desse inteiro é longo (por exemplo, ele pode invocar uma ida e volta da rede), então é um desperdício computá-lo em todos os casos que realmente não exigem ... e agora temos a ferramenta para fazer isso!

void func(MyClass& mc) {
  std::future<int> f = std::async(std::launch::deferred, []() {
                         return stoi(memcached.get("KEY"));
                       });

  mc.lazy(f);
}

Note que isso é sutilmente diferente de usar um std::function<int()> (e um fechamento), porque o cálculo é feito uma vez por todas , garantindo que as chamadas subseqüentes obtenha sempre o mesmo resultado.

A diferença com as outras políticas também pode ser expressa em termos de se a operação é executada quando você não precisa do valor .

  • any : pode ser executado em outro thread (proativamente) ou não executado em todos os
  • async : será executado em outro segmento
  • deferred : não será executado

Portanto, deferred oferece melhor controle, o que é importante se a chamada tiver um efeito colateral.

    
por Matthieu M. 11.02.2012 / 13:48
fonte