Sto provando a scrivere un'applicazione thread piuttosto semplice, ma sono nuovo alla libreria di thread di boost. Un semplice programma di test su cui sto lavorando è:(semplice) boost thread_group question
#include <iostream>
#include <boost/thread.hpp>
int result = 0;
boost::mutex result_mutex;
boost::thread_group g;
void threaded_function(int i)
{
for(; i < 100000; ++i) {}
{
boost::mutex::scoped_lock lock(result_mutex);
result += i;
}
}
int main(int argc, char* argv[])
{
using namespace std;
// launch three threads
boost::thread t1(threaded_function, 10);
boost::thread t2(threaded_function, 10);
boost::thread t3(threaded_function, 10);
g.add_thread(&t1);
g.add_thread(&t2);
g.add_thread(&t3);
// wait for them
g.join_all();
cout << result << endl;
return 0;
}
Tuttavia, quando ho compilare ed eseguire questo programma ho una potenza di
$ ./test
300000
test: pthread_mutex_lock.c:87: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted
Ovviamente, il risultato è corretto, ma io sono preoccupato su questo messaggio di errore, soprattutto perché il vero programma, che ha essenzialmente la stessa struttura, si blocca sul punto join_all(). Qualcuno può spiegarmi cosa sta succedendo? Esiste un modo migliore per farlo, ovvero avviare un numero di thread, memorizzarli in un contenitore esterno e attendere che vengano completati tutti prima di continuare il programma?
Grazie per il vostro aiuto.
È necessario rimuovere i puntini di sospensione tra la "nuova" allocazione di memoria e passarla al thread_group. Altrimenti se qualcosa va storto (cioè getta) nel codice che interviene, si perde il filo. –
Sì, questo sembra essere il caso ed è stata la causa del bug nel programma più grande pure. L'esempio di lavoro ora utilizza: // avvia tre thread g.add_thread (new boost :: thread (threaded_function, 10)); g.add_thread (nuovo boost :: thread (threaded_function, 10)); g.add_thread (nuovo boost :: thread (threaded_function, 10)); – RandomGuy
Un buon modo per assicurarsi che non ci siano perdite sarebbe stato usare la soluzione std :: unique_ptr o simile e usare ptr.get() per fornire il thread al group_thread. –
Klaim