2011-09-09 15 views
8

¿Es GCC 4.7.0 o es yo? ¿Qué hago mal?C++ 0x: hilo, gcc o mi error?

Esto arroja una std::system_error"Operación no permitida" excepción:

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(); 
}; 

mientras que esto funciona:

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 diferencia es, por supuesto:

  • El no código de trabajo utiliza un Functor (clase con operator())
  • El código de trabajo utiliza un puntero a función.

hacer yo utilizo el funtor mal, en algún lugar? No puedo ver dónde, ¿verdad? Es un indicio de que el gdb tiene esto en su pila:

#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> 

Notas: También probé

  • Inicializar DumbFib primero, dándole un mismo resultado miembro variable n_=35,.
  • Dar el funtor directamente con thread th{ DumbFib, 35 }; o thread th{ DumbFib{}, 35 };
+0

¿En qué sistema está ejecutando esto? – Jason

+1

Linux de 64 bits (Ubuntu 10.4 LTS), gcc-4.7.0, svn checkout de la semana pasada. – towi

Respuesta

13

Al compilar el código con g++, utilice la opción -pthread.

+0

Qué embarazoso ... Tuve ese error una vez y pensé que lo había corregido. No lo hice. Entonces, ahora funciona! ¡Estupendo! – towi

0

también estaba enfrentando problemas similares, y gracias Jason, resolvió mi problema

Las opciones exactas serán

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

Eso es lo que tengo que hacer en g ++ versión 4.6.3