¿Cuáles son las opciones de enlace correctas para usar std :: thread en GCC bajo linux?

87

Hola, estoy tratando de usar std::threadcon G ++. Aquí está mi código de prueba

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}

Se compila, pero cuando intento ejecutarlo, el resultado es:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted

Mi versión del compilador:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

¿Qué pasa con mi código de prueba?

ACTUALIZACIÓN: uso la siguiente línea de comando para compilar y ejecutar mi código.

$ g++ -std=c++0x test.cpp
$ ./a.out

y lo intenté

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out

Siempre lo mismo.

Motor de tierra
fuente
7
@Earth Engine: esta respuesta SO explica por qué no hay errores de enlace sin la biblioteca pthread: stackoverflow.com/a/6266345/12711 Respuesta corta: glibctiene códigos auxiliares que no hacen nada para muchas funciones pthread.
Michael Burr
@EarthEngine, ¿puede poner la solución en una respuesta? Específicamente que -lpthreaddebe seguir el archivo fuente.
River

Respuestas:

101

Creo que en Linux pthread se usa para implementar, std::threadpor lo que debe especificar la -pthreadopción del compilador.

Como esta es una opción de vinculación, esta opción del compilador debe ser DESPUÉS de los archivos fuente:

$ g++ -std=c++0x test.cpp -pthread
hmjd
fuente
Estoy tratando de compilar un programa muy simple usando gcc 4.7.1 y tengo el mismo error de "operación no permitida". El problema es que ya estoy usando el indicador -pthread. ¿Hay alguna otra bandera que conozca?
Filipe
6
Resolví el problema al eliminar la marca "-static" de las opciones del vinculador, no sé por qué sucede esto
Filipe
Me pregunto por qué el compilador no da un error al compilar sin la opción -lpthread. ¿¿Cualquiera??
zeus2
1
Bajo Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) tuve que agregar el -W1, --no-as-need g ++ --std = c ++ 11 -Wl, --no-según-necesidad -pthread main.cc
Begui
1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveresuelve el problema, no -pthread. Este es el enlace de problema de enlace Según las man gcc -pthreadopciones de g ++ que agregan soporte de subprocesos
múltiples
6

Además de usar -std=c++0xy -pthreaddebe no utilizar -static.

Bowie Owens
fuente
2

Aquí hay un archivo CMake simple para compilar un programa C ++ 11 que usa subprocesos:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
list(APPEND CMAKE_CXX_FLAGS "-pthread -std=c++11 ${CMAKE_CXX_FLAGS}")
add_executable(main main.cpp)

Una forma de construirlo es:

mkdir -p build
cd build
cmake .. && make
Alejandro
fuente
2
Su solución no es una mejora con respecto a la respuesta de hmjd para mí y agrega cosas innecesarias (elaboración de perfiles, cobertura de prueba)
Max Beikirch
1

Intente compilar de esta manera en un solo comando:

g++ your_prog.cpp -o your_output_binary -lpthread -std=gnu++11

También puede probar C ++ 11 en lugar de gnu ++ 11. Espero que esto funcione.

Ravi Shankar
fuente