Які правильні варіанти посилання використовувати 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.
Michael Burr

@EarthEngine, чи можете ви дати відповідь на рішення? Зокрема, що -lpthreadmust слід за вихідним файлом.
Річка

Відповіді:


101

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

Оскільки це варіант зв’язування, цей варіант компілятора повинен бути ПІСЛЯ вихідних файлів:

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

Я намагаюся скомпілювати дуже просту програму за допомогою gcc 4.7.1 і маю ту саму помилку "операція не дозволена". Проблема в тому, що я вже використовую прапор -pthread. Чи є якийсь інший прапор, про який ви знаєте?
Філіпе

5
Я вирішив проблему з видаленням прапорця "-static" з параметрів компонування, не знаю, чому це трапляється
Філіпе

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

1
Під Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) мені довелося додати -W1, --no-as-need g ++ --std = c ++ 11 -Wl, --no-as-need -pthread main.cc
Бегі

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveвирішує проблему, а не -pthread. Це посилання на проблему посилання Відповідно до man gcc -pthreadпросто опцій g ++, що додає підтримку багатопоточності, яка встановлює прапори як для препроцесора, так і для лінкера
Денис Зайкін

6

На додаток до використання -std=c++0xі -pthreadви не повинні використовувати -static.



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 для мене, і ви додаєте необов'язкові речі (профілювання, випробування)
Max Beikirch,

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.