ตัวเลือกลิงค์ที่ถูกต้องในการใช้ std :: thread ใน GCC ภายใต้ linux คืออะไร?


88

สวัสดีฉันกำลังพยายามใช้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.

เกิดอะไรขึ้นกับรหัสทดสอบของฉัน

UPDATE: ฉันใช้บรรทัดคำสั่งต่อไปนี้เพื่อคอมไพล์และรันโค้ดของฉัน

$ 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 คุณช่วยใส่คำตอบได้ไหม โดยเฉพาะว่า-lpthreadต้องเป็นไปตามไฟล์ต้นฉบับ
แม่น้ำ

คำตอบ:


102

ฉันคิดว่าบน Linux pthread ใช้เพื่อใช้งานstd::threadดังนั้นคุณต้องระบุ-pthreadตัวเลือกคอมไพเลอร์

เนื่องจากเป็นอ็อพชันการเชื่อมโยงอ็อพชันคอมไพเลอร์นี้จึงต้องอยู่หลังไฟล์ต้นทาง:

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

ฉันพยายามรวบรวมโปรแกรมที่เรียบง่ายโดยใช้ gcc 4.7.1 และพบข้อผิดพลาด "operation not allowed" เหมือนกัน ปัญหาคือฉันใช้แฟล็ก -pthread อยู่แล้ว มีธงอื่น ๆ ที่คุณรู้หรือไม่?
Filipe

6
ฉันแก้ไขปัญหาในการลบแฟล็ก "-static" ออกจากตัวเลือกตัวเชื่อมโยงไม่รู้ว่าทำไมจึงเกิดขึ้น
Filipe

ฉันสงสัยว่าทำไมคอมไพเลอร์ไม่ให้ข้อผิดพลาดเมื่อคอมไพล์โดยไม่มีตัวเลือก -lpthread ใครก็ได้ ??
zeus2

1
ภายใต้ Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) ฉันต้องเพิ่ม -W1, - no-as-needed g ++ --std = c ++ 11 -Wl, - no-as-needed -pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archive-pthreadแก้ไขปัญหาได้หรือไม่ นี่คือลิงค์ปัญหาการเชื่อมโยงตามman gcc -pthreadเป็นเพียงตัวเลือก g ++ ที่เพิ่มการรองรับมัลติเธรดที่ตั้งค่าสถานะสำหรับทั้งตัวประมวลผลล่วงหน้าและตัวเชื่อม
Denis Zaikin



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 หวังว่าจะได้ผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.