Quais são as opções de link corretas para usar std :: thread no GCC no Linux?


87

Olá, estou tentando usar o std::threadG ++. Aqui está meu código de teste

#include <thread>
#include <iostream>

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

Compila, mas quando tento executá-lo, o resultado é:

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

Minha versão do 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.

O que há de errado com meu código de teste?

ATUALIZAÇÃO: Eu uso a seguinte linha de comando para compilar e executar meu código.

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

e eu tentei

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

ainda o mesmo.


7
@Earth Engine: esta resposta SO explica porque não há erros de link sem a biblioteca pthread: stackoverflow.com/a/6266345/12711 Resposta curta: glibctem stubs do-nothing para muitas funções pthread.
Michael Burr

@EarthEngine você pode colocar a solução em uma resposta? Especificamente, -lpthreaddeve seguir o arquivo de origem.
Rio

Respostas:


101

Eu acho que no Linux pthread é usado para implementar, std::threadentão você precisa especificar a -pthreadopção do compilador.

Como esta é uma opção de vinculação, esta opção do compilador precisa estar APÓS os arquivos de origem:

$ g++ -std=c++0x test.cpp -pthread

Estou tentando compilar um programa muito simples usando gcc 4.7.1 e estou tendo o mesmo erro de "operação não permitida". O problema é que já estou usando o sinalizador -pthread. Existe alguma outra bandeira que você conhece?
Filipe

5
Resolvi o problema ao remover o sinalizador "-static" das opções do linker, não sei porque isso acontece
Filipe

Estou me perguntando por que o compilador não dá um erro ao compilar sem a opção -lpthread. Qualquer pessoa??
zeus2

1
No Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) Tive de adicionar o -W1, --no-as-needed g ++ --std = c ++ 11 -Wl, --no-como-necessário main.cc -pthread
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveresolve o problema, não -pthread. This is link issue link De acordo com man gcc -pthreadis just g ++ options que adiciona suporte a multithreading que define sinalizadores para o pré-processador e linker
Denis Zaikin



3

Aqui está um arquivo CMake simples para compilar um programa C ++ 11 que usa threads:

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)

Uma forma de construir é:

mkdir -p build
cd build
cmake .. && make

2
Sua solução não é nenhuma melhoria em relação à resposta de hmjd para mim e adiciona coisas desagradáveis ​​(criação de perfil, cobertura de teste)
Max Beikirch

1

Tente compilar desta forma em um único comando:

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

Você também pode tentar C ++ 11 em vez de gnu ++ 11. Espero que funcione.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.