ultima gnuc compiler compilador c++ gcc concurrency c++11 mingw

c++ - compiler - gnuc



¿Cómo habilitar las características de simultaneidad experimental de C++ 11 en MinGW? (8)

Al intentar compilar el siguiente código

#include <thread> #include <iostream> void foo() { std::cout << "foo/n"; } int main() { std::thread t(foo); t.join(); }

Me sale un error:

C:/Test>g++ -g -Wall -lpthread -std=c++0x main.cpp main.cpp: In function ''int main()'': main.cpp:12:2: error: ''thread'' is not a member of ''std'' main.cpp:12:14: error: expected '';'' before ''t'' main.cpp:13:2: error: ''t'' has not been declared

¿Cómo usar las características de simultaneidad experimental de C ++ 11? Tengo MinGW GCC 4.5.1 (TDM)

EDITAR: BTW, Visual Studio 2012 realiza bien este ejemplo de código.


Actualmente estoy trabajando en obtener un GCC cocido al vapor que utiliza la nueva biblioteca mingw-w64 winpthreads. Esto habilitaría un modelo de subprocesamiento en GCC, y se está trabajando para que funcione como debería. Otro usuario de mingw-w64 ya ha conseguido este funcionamiento pirateando (sensiblemente), pero estoy tratando de hacerlo en el GCC principal, sin intervención manual después de la instalación de la cadena de herramientas.

El presente debate puede seguirse here . Actualizaré esta respuesta una vez que se hayan suavizado todas las asperezas.

EDITAR : debido a un voto positivo, esta respuesta me llamó la atención. He creado un GCC 4.7 experimental, que debería funcionar con std::thread , pero solo cuando se vincula estáticamente (add -static al comando link). El anuncio está here .


Como otros han mencionado, el puerto mingw de gcc no proporciona soporte de concurrencia C ++ 0x de fábrica. Sin embargo, la biblioteca comercial just :: thread proporciona estas instalaciones, por lo que puede usar std::thread con el puerto TDM / mingw de gcc 4.5.2 .

Descargo de responsabilidad: soy el desarrollador principal de la biblioteca de just :: thread.


Cuando obtiene un compilador que admite std::thread aquí está su ejemplo corregido (dos type-o menores):

#include <thread> #include <iostream> void foo() { std::cout << "foo/n"; } int main() { std::thread t(foo); t.join(); }


Hasta donde yo sé, MinGW aún no es compatible con las nuevas características de concurrencia de c ++ 0x (a partir de GCC 4.5). Recuerdo haber leído un intercambio de listas de correo en el que se indicaba que en MinGW no se cumple el ifdef siguiente del encabezado del hilo:

#if defined(_GLIBCXX_HAS_GTHREADS)

Supongo que esto está relacionado de alguna manera con la forma en que se construye MinGW en Windows, si usa threads nativos o pthread, etc. En mi código, he escrito un envoltorio mínimo que usa Boost.thread en lugar de threads nativos de c ++ 0x cuando en Windows. Las dos interfaces son muy similares y para muchos usos se pueden intercambiar sin problemas.

EDITAR : Gracias a Luc Danton por desenterrar el hilo de la lista de correo mencionado anteriormente:

http://comments.gmane.org/gmane.comp.gnu.mingw.user/33065


Hay otra opción.

//Threading01.cpp #include <thread> #include <iostream> void hello() { std::cout<< "Hello Threading ..." << std::endl; } int main() { std::thread t1(hello); t1.join(); return 0; }

Descargue mingw-w64 (El proyecto mingw-w64 en sourceforge.net se traslada a mingw-w64.org ) y ejecute el archivo .bat (mingw-w64.bat) que le proporcionaron. En la línea de comando proporcionada, puede ejecutar su secuencia de comandos código como este

C:/CPP>g++ std=c++11 -g -Wall -lpthread -o Threading01 Threading01.cpp




Ya existe una implementación nativa ligera de std :: threads y primitivas de sincronización: https://github.com/meganz/mingw-std-threads

Es una biblioteca de solo encabezado y debería funcionar con cualquier versión C ++ 11 de MinGW.