2011-09-09 8 views
8

È GCC 4.7.0 o sono io? Cosa faccio di sbagliato?C++ 0x: thread, gcc o il mio errore?

Questo getta una "operazione non consentita" std::system_error eccezione:

struct DumbFib { 
    size_t operator()(size_t n) { return fib(n); } 
    static size_t fib(size_t n) { 
     return n<2 ? 1 : fib(n-2)+fib(n-1); 
    } 
}; 

void sample() { 
    DumbFib dumbfib; 
    thread th{ dumbfib, 35 }; // <- system_error! 
    th.join(); 
}; 

mentre questo funziona:

void work(size_t loop) { 
    for(int l = loop; l>0; --l) { 
     for(int i = 1000*1000; i>0; --i) 
      ; 
     cerr << l << "..."; 
    } 
    cerr << endl; 
} 

int main() { 
    //sample(); 
    thread t { work, 100 };  // <- fine 
    t.join(); 
} 

La differenza è, naturalmente:

  • Il non - il codice di lavoro utilizza un Functor (classe con operator())
  • Il codice di lavoro utilizza un puntatore di funzione.

si usa il funtore sbagliato, da qualche parte? Non riesco a vedere dove, vero? E 'un suggerimento che il gdb ha questo nel suo stack:

#7 ... in std::thread::_M_start_thread (..., __b=warning: RTTI symbol not found\ 
    for class 'std::_Sp_counted_ptr_inplace<std::thread::_Impl<std::\ 
    _Bind_simple<DumbFib()(int)> >, ..., (__gnu_cxx::_Lock_policy)2> 

Note: Ho anche provato

  • inizializzazione DumbFib prima, dandogli un membro stesso risultato variabile n_=35,.
  • Dare funtore direttamente con thread th{ DumbFib, 35 }; o thread th{ DumbFib{}, 35 };
+0

Quale sistema stai eseguendo? – Jason

+1

linux 64 bit (ubuntu 10.4 LTS), gcc-4.7.0, checkout svn della scorsa settimana. – towi

risposta

13

Quando si compila il codice con g++, utilizzare l'opzione -pthread.

+0

Quanto imbarazzante .. Ho avuto quell'errore una volta e ho pensato di correggerlo. Non l'ho fatto Quindi, ora funziona! Grande! – towi

0

ero anche affrontando problemi simili, e grazie Jason, ha risolto il mio problema

Le opzioni esatte saranno

g++ code.cpp -lpthread -std=c++0x 

Questo è quello che devo fare sul g ++ versione 4.6.3