2014-06-11 17 views
5

Sto cercando di farlo fare che non posso chiamare thread da un ciclo. Ma quando l'eseguo ottengo un errore di runtime:Perché questo semplice codice di thread ha esito negativo?

terminate called after throwing an instance of 'std::system_error'
what(): Invalid argument Thread #1

#include <iostream> 
#include <vector> 
#include <memory> 
#include <thread> 
#include <mutex> 

std::mutex m; 
static int thread_count; 

auto foo = [&] { 
    std::lock_guard<std::mutex> lock(m); 
    std::cout << "Thread #" << ++thread_count << std::endl; 
}; 

int main() 
{ 
    std::vector<std::shared_ptr<std::thread>> 
      threads(20, std::make_shared<std::thread>(foo)); 

    for (const auto& th : threads) 
     th->join(); 
} 
+0

@juanchopanza Sì –

+0

Eseguilo sotto gdb con 'catch throw'. –

+2

@sharth ha ragione. Ma perché il 'shared_ptrs'? – juanchopanza

risposta

12

Il codice solo crea in realtà un thread figlio, e quindi chiama join() su che un thread 20 volte.

Per verificare ciò, si potrebbe aggiungere il seguente ciclo subito dopo si costruisce il vettore:

for (int i=1; i<threads.size(); ++i) 
    assert(threads[i - 1].get() == threads[i].get()); 

È probabile che desidera creare il vostro vettore con una qualche forma di:

std::vector<std::shared_ptr<std::thread>> threads(20); 
for (auto & thread : threads) 
    thread = std::make_shared<std::thread>(foo); 
+0

@DavidSchwartz Ci sono molte copie dello stesso shared_ptr nel vettore. O molti shared_ptrs che gestiscono lo stesso oggetto. – juanchopanza

+2

Ooh, hai ragione. Dovresti farlo notare nella risposta. L'intuizione chiave è che 'make_shared' è chiamato solo una volta. –

Problemi correlati