Sto lavorando a un programma in cui mi piacerebbe utilizzare async in un ciclo. Nel codice di esempio che ho incluso ci sono solo 10 elementi, quindi ho potuto creare facilmente una variabile esplicita per ogni elemento. Tuttavia, nel mio programma principale, il numero di elementi nel vettore può variare. Idealmente, mi piacerebbe creare un vettore di thread asincroni - uno per ogni elemento dell'array - che vengono rimandati sul vettore asincrono mentre faccio il ciclo. Quindi voglio aspettare che tutti si completino, e poi usare " get() "per restituire tutte le loro uscite.Numero variabile di thread asincroni con C++ 11
Il codice seguente chiamerà asincrono assegnando una variabile esplicita per ogni thread, ma qualcuno sa come chiamare in modo dinamico asincrono in un vettore senza dover assegnare esplicitamente una variabile ad esso? Idealmente, mi piacerebbe che questo programma chiamasse "std :: cout" una volta ogni volta che passava in loop, invece che una sola volta.
#include <iostream>
#include <vector>
#include <string>
#include <future>
std::string hi (std::string input)
{
return "hello, this is " + input;
}
int main()
{
std::vector<std::string> test_vector(10, "a test");
std::future<std::string> a;
std::future<std::string> b;
for (int i = 0; i < test_vector.size (); i++)
{
a = std::async(std::launch::async, hi, test_vector[i]);
}
std::cout << a.get() << std::endl;
return 0;
}
E quale è esattamente la tua domanda? – Columbo
Come chiamare in modo dinamico asincrono ogni volta che passa il ciclo anziché dover creare una variabile in modo esplicito. –
Il codice sopra riportato ha un grave difetto, ogni volta che assegni un nuovo futuro a 'a' lo imponi di bloccare e attendi che il thread associato al suo vecchio valore finisca, quindi stai funzionando in modo efficace in serie. Ad ogni modo, sono sorpreso che la soluzione a un numero dinamico di futuri non sia del tutto ovvia: immagazzina ogni nuovo futuro in un contenitore di dimensioni dinamiche, come un vettore. Hai persino detto tu stesso: _ "Mi piacerebbe creare un vettore di thread asincroni, uno per ogni elemento dell'array, che viene spostato sul vettore asincrono mentre faccio il loop." _ Quindi perché non hai appena Fai quello! –