vector de std :: hilos

C ++ 11

Estoy tratando de hacer unvector destd::threads. La combinación de los siguientes tres puntos dice que puedo.

1.) De acuerdo ahttp://en.cppreference.com/w/cpp/thread/thread/thread, threadEl constructor por defecto crea un

Objeto de hilo que no representa un hilo.

2.) De acuerdo ahttp://en.cppreference.com/w/cpp/thread/thread/operator%3D, thread’Soperator=

Asigna el estado de [el parámetro, que es una referencia de valor de subproceso] a [el subproceso de llamada] usando la semántica de movimiento.

3.) De acuerdo ahttp://en.cppreference.com/w/cpp/container/vector/vector, al pasar solo una variable de tipo de tamaño a un constructor vectorial se construirá

el contenedor con [el número especificado de] instancias de T. inicializadas en valor (construidas por defecto, para las clases). No se realizan copias.

Entonces, hice esto:

#include <iostream>
#include <thread>
#include <vector>

void foo()
{
    std::cout << "Hello\n";
    return;
}

int main()
{
    std::vector<std::thread> vecThread(1);
    vecThread.at(0) = std::thread(foo);
    vecThread.at(0).join();
    return 0;
}

Esto funciona como se espera en VC11 yg ++ 4.8.0 (compilador en línea aquí) como se ve en lo siguiente:

Salida de consola:

Hello

Luego lo probé en el Clang 3.2, al alternar el menú del compilador en la misma página web, lo que da:

stderr: 
pure virtual method called
terminate called without an active exception

Cuando un objeto de subproceso, que representa un subproceso, se sale del ámbito antes de serjoin()ed odetach()Ed, el programa se verá obligado a terminar. yo tengojoin()edvecThread.at(0), así que lo único que queda en cuestión es el hilo temporal

std::thread(foo);

en el

vecThread.at(0) = std::thread(foo);

asignación.

Sin embargo, de acuerdo con la referencia web, solo se pueden asignar subprocesos moviendo una referencia de valor de subproceso. No puedo pensar en ninguna manera dejoin() odetach() un objeto de hilo temporal.

Entonces, si la salida de clang es correcta, entonces ¿cuál es el uso dethread’Soperator=? ¿O es esto un error del compilador Clang?

En g ++ 4.8.0, cambiando la línea

vecThread.at(0) = std::thread(foo)

a

vecThread.at(0) = std::thread{foo}

(reemplazando los paréntesis con llaves) todavía da el esperadoHello salida.

Sin embargo, cambiando la línea avecThread.at(0) = {foo} hace que se queje:

La queja de g ++ 4.8.0 sobre llaves:

error: la conversión a 'std :: thread' desde la lista de inicializadores usaría el constructor explícito 'std :: thread :: thread (_Callable &&, _Args && ...) [with _Callable = void (&) (); _Args = {}] 'vecThread.at (0) = {foo};

que es demasiado avanzado, no sé lo que significa.

Hacer el mismo cambio en clang da aún más avanzado:

La queja de Clang 3.2 sobre llaves:

error: no viable overloaded '='
vecThread.at(0) = {foo};
...
note: candidate function not viable: cannot convert initializer list
argument to 'const std::thread'
thread& operator=(const thread&) = delete;
...
note: candidate function not viable: cannot convert initializer list
argument to 'std::thread'
thread& operator=(thread&& __t) noexcept

y tampoco sé lo que eso significa.

No puedo usar VC11 para corroborar lo anterior

vecThread.at(0) = {foo}

problemas porque VC11, a partir del compilador CTP de noviembre de 2012, no admite una sintaxis de inicialización uniforme en la Biblioteca estándar.

Respuestas a la pregunta(1)

Su respuesta a la pregunta