Questo è un po 'grezzo, ma come di ora funziona ancora per le mie esigenze. :) Sto usando boost 153 e qt. Ho creato un vettore di int per tracciare lo "stato" dei miei thread. Ogni volta che creo un nuovo thread, aggiungo una voce a thread_ids con un valore pari a 0. Per ogni thread creato, trasmetto un ID in modo da sapere quale parte di thread_ids devo aggiornare. Imposta lo stato su 1 per l'esecuzione e altri valori in base all'attività che sto svolgendo, quindi so quale attività è stata eseguita al termine del thread. 100 è il valore che ho impostato per un thread correttamente finito. Non sono sicuro che ciò possa essere d'aiuto, ma se hai altri suggerimenti su come migliorare su questo fammelo sapere. :)
std::vector<int> thread_ids;
const int max_threads = 4;
void Thread01(int n, int n2)
{
thread_ids.at(n) = 1;
boost::this_thread::sleep(boost::posix_time::milliseconds(n2 * 1000));
thread_ids.at(n) = 100;
qDebug()<<"Done "<<n;
}
void getThreadsStatus()
{
qDebug()<<"status:";
for(int i = 0; i < max_threads, i < thread_ids.size(); i++)
{
qDebug()<<thread_ids.at(i);
}
}
int main(int argc, char *argv[])
{
for(int i = 0; i < max_threads; i++)
{
thread_ids.push_back(0);
threadpool.create_thread(
boost::bind(&boost::asio::io_service::run, &ioService));
ioService.post(boost::bind(Thread01, i, i + 2));
getThreadsStatus();
}
ioService.stop();
threadpool.join_all();
getThreadsStatus();
}
È un po 'fuorviante dire che può portare a una condizione di gara. 'timed_join' da solo non può farlo. se si formulano ipotesi errate in base al risultato della chiamata, è possibile che si verifichi una condizione di competizione, naturalmente, ma ciò non ha molto a che fare con 'timed_join' piuttosto che con voi assumendo che il risultato di tale chiamata sia ancora valido. Ad ogni modo, +1 – jalf
Penso che sia davvero pessimo. Perché i designer di boost non pensano mai all'intuitività o ai principianti. Un semplice metodo isRunning() sarebbe stato sufficiente. Invece costringono uno a usare una funzione che non dovrebbe essere intuitivamente utilizzata in questo caso. Non voglio provare a partecipare al thread, voglio solo testare rapidamente se fa ancora qualcosa. Questa è una merda. Ho perso un sacco di tempo prima di aver trovato questo. Neanche una parola dannata nei "documenti". – AndreasT
Un thread può essere in 3 stati: In esecuzione, Separato, NotRunning. –