Espacios de nombres
Variantes

std::thread::thread

De cppreference.com
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
(C++11)
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
(C++11)
Recuperación segura
(C++26)
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
<tbody> </tbody>
thread();
(1) (desde C++11)
thread( thread&& other );
(2) (desde C++11)
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );
(3) (desde C++11)
thread(const thread&) = delete;
(4) (desde C++11)

Construye un nuevo objeto std::thread.

1) Crea un objeto nuevo que no representa a ningún hilo.
2) Constructor de movimiento. Construye el objeto other para representar el hilo de ejecución que estaba representado por other. Después de esta llamada other ya no representa ningún hilo de ejecución.
3) Crea un nuevo objeto std::thread y lo asocia con un hilo de ejecución. El nuevo hilo de ejecución empieza ejecutando
std::invoke(decay_copy(std::forward<Function>(f)), 
            decay_copy(std::forward<Args>(args))...);

donde decay_copy se define como:

template <class T>
std::decay_t<T> decay_copy(T&& v) { return std::forward<T>(v); }
excepto que las llamadas a decay_copy se evalúan en el contexto del llamador, de modo que cualquier excepción lanzada durante la evaluación y copia/movimiento de los argumentos se lanza en el hilo actual, sin iniciar el nuevo hilo.
La finalización de la invocación del constructor se sincroniza con (como se define en std::memory_order) el comienzo de la invocación de la copia de f en el nuevo hilo de ejecución.
Este constructor no participa en la resolución de sobrecarga si std::decay<Function>::type es el mismo tipo que std::thread.
4) El constructor de copia está eliminado; los objetos de tipo std::thread no son copiables. Dos objetos std::thread no pueden representar al mismo hilo de ejecución.

Parámetros

other - Otro objeto std::thread con el cual construir este objeto hilo.
f - Objeto Callable a ejecutar en el nuevo hilo.
args... - Argumentos a pasar a la nueva función.

Poscondiciones

1) get_id() es igual a std::thread::id() (p. ej., joinable es false).
2) other.get_id() es igual a std::thread::id() y get_id() devuelve el valor de other.get_id() antes de iniciar la ejecución.
3) get_id() no es igual a std::thread::id() (p. ej., joinable es true).

Excepciones

3) std::system_error si no pudo iniciarse el hilo. La excepción puede representar la condición de error std::errc::resource_unavailable_try_again u otra condición de error específica de la implementación.

Notas

Los argumentos de la función del hilo se copian por valor. Si se quiere pasar un argumento por referencia a la función del hilo, tiene que ser envuelto (por ejemplo, con std::ref o std::cref).

Cualquier valor de retorno de la función se ignora. Si la función lanza una excepción, se llama a std::terminate. Para pasar valores de retorno o excepciones al hilo de llamada, puede usarse std::promise o std::async.

Ejemplo

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>

void f1(int n)
{
    for(int i=0; i<5; ++i) {
        std::cout << "Hilo " << n << " ejecutando\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

void f2(int& n)
{
    for(int i=0; i<5; ++i) {
        std::cout << "Hilo 2 ejecutando\n";
        ++n;
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main()
{
    int n = 0;
    std::thread t1; // t1 no es un hilo
    std::thread t2(f1, n+1); // pasar por valor
    std::thread t3(f2, std::ref(n)); // pasar por referencia
    std::thread t4(std::move(t3)); // t4 ahora está ejecutando a f2(). t3 ya no es un hilo
    t2.join();
    t4.join();
    std::cout << "Valor final de n es " << n << '\n';
}

Posible salida:

Hilo 1 ejecutando
Hilo 2 ejecutando
Hilo 1 ejecutando
Hilo 2 ejecutando
Hilo 1 ejecutando
Hilo 2 ejecutando
Hilo 1 ejecutando
Hilo 2 ejecutando
Hilo 1 ejecutando
Hilo 2 ejecutando
Valor final de n es 5

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2097 C++11 El constructor que toma un objeto Callable puede ser ambiguo con el constructor de movimiento. Se restrigió.

Referencias

  • El estándar C++20 (ISO/IEC 14882:2020):
  • 32.4.2.2 thread constructors [thread.thread.constr]
  • El estándar C++17 (ISO/IEC 14882:2017):
  • 33.3.2.2 thread constructors [thread.thread.constr]
  • El estándar C++14 (ISO/IEC 14882:2014):
  • 30.3.1.2 thread constructors [thread.thread.constr]
  • El estándar C++11 (ISO/IEC 14882:2011):
  • 30.3.1.2 thread constructors [thread.thread.constr]

Véase también

Construye un nuevo objeto jthread
(función miembro pública de std::jthread) [editar]
Documentación de C para thrd_create