std :: async ha un overload che accetta un criterio std :: launch come primo argomento. Quando dovrei usare questo sovraccarico? quali sono le diverse politiche disponibili? (Penso che la sincronizzazione e l'asincrono siano le due opzioni). Quando dovrei usare la politica di sincronizzazione? In che modo è diverso dal gestirlo direttamente?Quando dovrei usare std :: async con sincronizzazione come criterio?
risposta
Riepilogo da the very helpful article that Jagannath linked e commenti sui possibili usi.
Ci sono 3 le politiche di lancio:
any
: la libreria sceglie se genera un thread di un o noasync
: si chiede in modo esplicito per un filo da generatodeferred
: in modo esplicito chiedere una discussione non da generare spa
Pertanto, ilLa politicaè un modo per ottenere la valutazione lenta deterministica (nota anche come chiamata per necessità). Per esempio, supponiamo di avere:
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());
}
Ora, se il calcolo del valore di questo intero è lunga (per esempio, può invocare un andata e ritorno di rete), quindi è un pò uno spreco di calcolare in tutta la casi che non lo richiedono veramente ... e ora abbiamo lo strumento per farlo!
void func(MyClass& mc) {
std::future<int> f = std::async(std::launch::deferred, []() {
return stoi(memcached.get("KEY"));
});
mc.lazy(f);
}
noti che questo è leggermente diverso da utilizzando un std::function<int()>
(e chiusura), perché il calcolo è fatto volta per tutte, garantendo che le chiamate successive per ottenere sempre lo stesso risultato.
La differenza con le altre politiche può anche essere espressa in termini di se l'operazione viene eseguita quando non è necessario il valore.
any
: potrebbe essere eseguita su un altro thread (proattivo) o non eseguita affattoasync
: verranno eseguiti su un altro threaddeferred
: si non essere eseguite
Pertanto, deferred
offre un controllo migliore, che è importante se la chiamata ha un effetto collaterale.
"sync" è in realtà 'std :: launch :: deferred' – Cubbi
@Cubbi: grazie per aver segnalato, avrei dovuto verificare con lo standard. –
"le successive chiamate a' get() '" invocheranno un comportamento indefinito, poiché 'get()' invalida 'future'. Avresti bisogno di un 'shared_future' per evitare l'invalidazione. –
- 1. Quando dovrei usare std :: thread :: detach?
- 2. Quando dovrei usare async/await e quando no?
- 3. Polimero: quando usare async?
- 4. Devo usare std :: default_random_engine o dovrei usare std :: mt19937?
- 5. il comportamento di std :: async con std :: launch :: politica async
- 6. C# Quando dovrei usare List e quando dovrei usare l'arraylist?
- 7. Quando dovrei usare AQL?
- 8. Quando dovrei usare ConcurrentSkipListMap?
- 9. Quando dovrei usare CompiledQuery?
- 10. std :: async - std :: launch :: async | std :: launch :: deferred
- 11. Come usare std :: async su una funzione membro?
- 12. Quando dovrei usare git stash?
- 13. Quando dovrei usare l'Interface Builder?
- 14. Quando dovrei usare l'inizializzazione uniforme?
- 15. Come usare lambda async con SelectMany?
- 16. Quando dovrei usare # in ColdFusion?
- 17. Quando dovrei usare un parser?
- 18. Quando dovrei usare metodi statici?
- 19. Quando dovrei usare setUpClass e quando __init__?
- 20. Quando dovrei usare require() e quando usare define()?
- 21. Quando e come usare std :: locale :: messages?
- 22. Confusione sui thread lanciati da std :: async con std :: launch :: parametro async
- 23. Quando dovrei implementare std :: convert :: From vs std :: convert :: Into?
- 24. Quando dovrei occuparmi di std :: iostream :: sentry?
- 25. Cosa dovrei usare come manichino attendibile?
- 26. Quando/Perché dovrei usare Multithread in Java?
- 27. Quando dovrei usare C++ anziché SQL?
- 28. Comportamento di GCC con std :: async (std :: launch :: async) rispetto al comportamento di Clang
- 29. Quando dovrei usare Sql Azure e quando dovrei usare la tabella Storage?
- 30. Quando dovrei usare Import-Package e quando dovrei usare Require-Bundle?
http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html ---> Questo potrebbe essere utile – Jagannath