Perché bloccare?
std::async();
rendimenti std::future
oggetto temporaneo
- temporanea oggetto viene distrutto immediatamente, chiamando desctructor.
std::future
Il distruttore sta bloccando. È cattivo e problematico.
Perché l'assegnazione è ok?
Assegnando a una variabile, l'oggetto restituito non viene distrutto immediatamente, ma in un secondo momento, fino alla fine dell'ambito del codice chiamante.
Codice Esempio: main1
è ok. main2
e main3
bloccano in modo equivalente il thread principale.
void forever() {
while (true);
}
void main1() {
std::future<void> p = std::async(std::launch::async, forever);
std::cout << "printing" << std::endl; // can print, then forever blocking
}
void main2() {
std::async(std::launch::async, forever);
std::cout << "printing" << std::endl; // forever blocking first, cannot print
}
void main3() {
{std::future<void> p = std::async(std::launch::async, forever);}
std::cout << "printing" << std::endl; // forever blocking first, cannot print
}
Date un'occhiata a cplusplus.com
valore di ritorno di std :: asincrona Quando si seleziona il lancio :: asincrono, il futuro restituito è legata alla fine del thread creato, anche se il suo stato condiviso non è mai raggiunto: in questo caso, il suo distruttore si sincronizza con il ritorno di fn. Pertanto, il valore restituito non deve essere ignorato per il comportamento asincrono , anche quando fn restituisce void.
Forse il '' '' ''' restituito da' '' async''' viene immediatamente distrutto. Non mi sorprenderebbe se il distruttore '' '' '' '' 'abbia un'attesa implicita all'interno. –