Apa sajakah opsi tautan yang benar untuk menggunakan std :: thread di GCC pada linux?

88

Hai, saya mencoba menggunakan std::threaddengan G ++. Ini kode tes saya

#include <thread>
#include <iostream>

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

Ini dikompilasi, tetapi ketika saya mencoba menjalankannya, hasilnya adalah:

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

Versi kompiler saya:

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

Apa yang salah dengan kode tes saya?

UPDATE: Saya menggunakan baris perintah berikut untuk mengkompilasi dan menjalankan kode saya.

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

dan saya mencoba

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

masih sama.

Mesin Bumi
sumber
7
@Earth Engine: jawaban SO ini menjelaskan mengapa tidak ada kesalahan tautan tanpa pustaka pthread: stackoverflow.com/a/6266345/12711 Jawaban singkat: glibcmemiliki rintisan do-nothing untuk banyak fungsi pthread.
Michael Burr
@EarthEngine dapatkah Anda memberikan solusi dalam sebuah jawaban? Secara khusus yang -lpthreadharus mengikuti file sumber.
Sungai

Jawaban:

102

Saya pikir di Linux pthread digunakan untuk mengimplementasikan std::threadsehingga Anda perlu menentukan -pthreadopsi compiler.

Karena ini adalah opsi penautan, opsi kompilator ini harus SETELAH file sumber:

$ g++ -std=c++0x test.cpp -pthread
hmjd
sumber
Saya mencoba mengkompilasi program yang sangat sederhana menggunakan gcc 4.7.1 dan saya mengalami kesalahan "operasi tidak diizinkan" yang sama. Masalahnya adalah saya sudah menggunakan flag -pthread. Apakah ada bendera lain yang Anda ketahui?
Filipe
6
Saya menyelesaikan masalah dengan menghapus tanda "-static" dari opsi penaut, tidak tahu mengapa ini terjadi
Filipe
Saya bertanya-tanya mengapa kompiler tidak memberikan kesalahan saat mengkompilasi tanpa opsi -lpthread. Siapa saja??
zeus2
1
Di bawah Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) saya harus menambahkan -W1, --tidak sesuai kebutuhan g ++ --std = c ++ 11 -Wl, --tidak sesuai kebutuhan -pthread main.cc
Begui
1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archivemenyelesaikan masalah, bukan -pthread. Ini adalah tautan masalah tautan Menurut man gcc -pthreadhanya g ++ opsi yang menambahkan dukungan multithreading yang menetapkan bendera untuk preprocessor dan linker
Denis Zaikin
6

Selain menggunakan -std=c++0x dan tidak-pthread boleh digunakan .-static

Bowie Owens
sumber
2

Berikut file CMake sederhana untuk mengompilasi program C ++ 11 yang menggunakan utas:

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)

Salah satu cara membangunnya adalah:

mkdir -p build
cd build
cmake .. && make
Alexander
sumber
2
Solusi Anda tidak ada perbaikan atas jawaban hmjd untuk saya dan menambahkan hal-hal yang tidak wajar (profiling, cakupan tes)
Max Beikirch
1

Coba kompilasi dengan cara ini dalam satu perintah:

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

Anda juga dapat mencoba C ++ 11 sebagai ganti gnu ++ 11. Semoga ini berhasil.

Ravi Shankar
sumber