2011-03-01 9 views
5

Hola Tengo un hilo Boost que debería devolver un doble. La función tiene el siguiente aspecto:Retorno Doble del hilo Boost

void analyser::findup(const double startwl, const double max, double &myret){ 
    this->data.begin(); 
    for(int i = (int)data.size() ; i >= 0;i--){ 
    if(this->data[i].lambda > startwl){ 
     if(this->data[i].db >= (max-30)) { 
     myret = this->data[i+1].lambda; 
     std::cout <<"in thread " << myret << std::endl; 
     return; 
     } 
    } 
    } 
} 

esta función es llamada por otra función:

void analyser::start_find_up(const double startwl, const double max){ 
    double tmp = -42.0; 
    boost::thread up(&analyser::findup,*this, startwl,max,tmp); 
    std::cout << "before join " << tmp << std::endl; 
    up.join(); 
    std::cout << "after join " << tmp << std::endl; 
} 

De todas formas he intentado y buscado en Google casi cualquier cosa, pero no puedo conseguir que devuelve un valor.

La salida se ve así en este momento.

before join -42 
in thread 843.487 
after join -42 

Gracias por cualquier ayuda.

Respuesta

6

tmp no obtiene el valor esperado después de la unión de subprocesos porque la creación de un objeto boost :: thread copia todos los argumentos en el almacenamiento de subprocesos (see documentation).

Debe encapsular tmp con boost::ref, que tiene el efecto de proporcionar un "modelo de copia-construible" (lo siento si la terminología es inadecuada, pero esa es la idea)

double tmp = -42.0; 
boost::thread up(&analyser::findup,*this, startwl,max, boost::ref(tmp)); 

Más sobre el Thread Management documentation

+1

Lo específico a tener en cuenta es que los argumentos están * copiados *. Mire las [notas del constructor] (http://www.boost.org/doc/libs/1_46_0/doc/html/thread/thread_management.html#thread.thread_management.thread.multiple_argument_constructor) en la documentación. – chrisaycock

+0

Ya he aprobado su edición pendiente, por lo que no puedo hacer mis propios cambios a la pregunta. ¿Podrías modificar la pregunta una vez más para que las etiquetas sean * boost * y * C++ *? Las etiquetas actuales no tienen sentido. – chrisaycock

+0

@chrisaycock hecho. ¡gracias por la explicación! – CharlesB

Cuestiones relacionadas