std::thread::thread
De cppreference.com
<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
excepto que las llamadas a
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); }
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
Ejecuta este código
#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)
| |
Documentación de C para thrd_create
| |