Saltar al contenido

Pasar objeto por referencia a std::thread en C++11

Agradecemos tu apoyo para compartir nuestras secciones en referencia a las ciencias informáticas.

Solución:

Inicializar explícitamente el subproceso con un reference_wrapper mediante el uso std::ref:

auto thread1 = std::thread(SimpleThread, std::ref(a));

(o std::cref en lugar de std::ref, según sea apropiado). Según notas de cppreference en std:thread:

Los argumentos de la función de subproceso se mueven o copian por valor. Si es necesario pasar un argumento de referencia a la función de subproceso, debe ajustarse (por ejemplo, con std::ref o std::cref).

Basado en este comentario, esta respuesta explica la razón por la cual los argumentos no se pasan por referencia a la función de hilo por defecto.

Considere la siguiente función SimpleThread():

void SimpleThread(int& i) 
    std::this_thread::sleep_for(std::chrono::seconds1);
    i = 0;

Ahora, imagina lo que podría pasar si el siguiente código compilado (lo hace no compilar):

int main()

    
        int a;
        std::thread th(SimpleThread, a);
        th.detach();
    
    // "a" is out of scope
    // at this point the thread may be still running
    // ...

El argumento asería pasado por referencia a SimpleThread(). El hilo aún puede estar durmiendo en la función. SimpleThread() después de la variable a ya ha salido del alcance y su vida útil ha terminado. En ese caso, i en SimpleThread() en realidad sería un referencia colgantey la tarea i = 0 resultaría en comportamiento indefinido.

Al envolver argumentos de referencia con la plantilla de clase std::reference_wrapper (utilizando las plantillas de funciones std::ref y std::cref) usted expresa explícitamente sus intenciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *