Каковы правильные параметры ссылки для использования std :: thread в GCC под Linux?


87

Привет, я пытаюсь использовать std::threadс G ++. Вот мой тестовый код

#include <thread>
#include <iostream>

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

Он компилируется, но когда я пытаюсь его запустить, результат:

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

Моя версия компилятора:

$ 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.

Что не так с моим тестовым кодом?

ОБНОВЛЕНИЕ: я использую следующую командную строку для компиляции и запуска моего кода.

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

и я попробовал

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

все тот же.


7
@Earth Engine: этот SO-ответ объясняет, почему без библиотеки pthread нет ошибок ссылок: stackoverflow.com/a/6266345/12711 Краткий ответ: glibcдля многих функций pthread есть заглушки, которые ничего не делают.
Майкл Берр

@EarthEngine, не могли бы вы включить решение в ответ? В частности, он -lpthreadдолжен следовать за исходным файлом.
River

Ответы:


101

Я думаю, что в Linux для реализации используется pthread, std::threadпоэтому вам нужно указать параметр -pthreadкомпилятора.

Поскольку это вариант связывания, этот параметр компилятора должен быть ПОСЛЕ исходных файлов:

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

Я пытаюсь скомпилировать очень простую программу, используя gcc 4.7.1, и у меня такая же ошибка «операция не разрешена». Проблема в том, что я уже использую флаг -pthread. Есть ли еще какой-нибудь флаг, о котором вы знаете?
Filipe

6
Я решил проблему, удалив флаг «-static» из параметров компоновщика, не знаю, почему это происходит
Филипе

Мне интересно, почему компилятор не выдает ошибку при компиляции без опции -lpthread. Кто-нибудь ??
zeus2

1
В Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) мне пришлось добавить -W1, --no-as-required g ++ --std = c ++ 11 -Wl, --no-as-need -pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveне решает проблему -pthread. Это ссылка на проблему ссылки. Согласно, man gcc -pthreadэто просто параметры g ++, которые добавляют поддержку многопоточности, которая устанавливает флаги как для препроцессора, так и для компоновщика
Денис Заикин



2

Вот простой файл CMake для компиляции программы на C ++ 11, использующей потоки:

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)

Один из способов его создания:

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

2
Ваше решение не является для меня улучшением по сравнению с ответом hmjd и добавляет ненужные вещи (профилирование, тестовое покрытие)
Макс Бейкирх

1

Попробуйте скомпилировать этот способ одной командой:

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

Вы также можете попробовать C ++ 11 вместо gnu ++ 11. Надеюсь, это сработает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.