การรวบรวมโค้ดมัลติเธรดด้วย g ++


89

ฉันมีรหัสที่ง่ายที่สุดที่เคยมีมา:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "another thread";
}

int main()
{
    std::thread t(worker);
    std::cout << "main thread" << std::endl;
    t.join();
    return 0;
}

แม้ว่าฉันจะยังไม่สามารถรวบรวมg++เพื่อเรียกใช้

รายละเอียดเพิ่มเติม:

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
Copyright (C) 2013 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++ main.cpp -o main.out -pthread -std=c++11

วิ่ง:

$ ./main.out 
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)

และตอนนี้ฉันติดอยู่ ในทุกหัวข้อที่เกี่ยวข้องทางอินเทอร์เน็ตขอแนะนำให้เพิ่ม-pthreadในขณะที่มีอยู่แล้ว

ผมทำอะไรผิดหรือเปล่า?

PS: เป็นการติดตั้ง Ubuntu 13.10 ใหม่ล่าสุด g++ติดตั้งเฉพาะแพ็คเกจและสิ่งเล็ก ๆ น้อย ๆ เช่นchromiumฯลฯ

PPS:

$ ldd ./a.out 
linux-vdso.so.1 => (0x00007fff29fc1000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb85397d000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb853767000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb85339e000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb85309a000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fb853c96000)

PPPS: ด้วยclang++(v3.2) จะคอมไพล์และทำงานได้ดี

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

PPPPPS:

$ dpkg --get-selections | grep 'libc.*dev'
libc-dev-bin                    install
libc6-dev:amd64                 install
libclang-common-dev             install
linux-libc-dev:amd64                install

เป็น symlink ไปยังlibpthread-2.17.soไดเร็กทอรีเดียวกัน
zerkms

ใช่นั่นคือลิงค์ที่ถูกต้อง นี่คือ dir ของฉัน lrwxrwxrwx 1 root root 18 ก.ย. 55 20:52 libpthread.so.0 -> libpthread-2.16.so
Jason Enochs

@ Jason Enochs: มันจะใช้ได้สำหรับฉัน - ฉันเห็นด้วยถ้าฉันไม่ได้ใช้รุ่น buggy gcc
zerkms

ใช่แล้วห้องสมุดทั้งหมดของคุณใหม่กว่าของฉันเล็กน้อย: gcc เวอร์ชัน 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)
Jason Enochs

@ Jason Enochs: ฮิฮิ สำหรับตัวฉันเองฉันพอใจกับคำตอบ "มันเป็นข้อผิดพลาด" แล้วและอาจจะลองรันบนอูบุนตูรุ่นเก่าในวันพรุ่งนี้เพื่อให้แน่ใจอย่างสมบูรณ์
zerkms

คำตอบ:


75

คำตอบที่ถูกจัดให้โดยเป็นสมาชิกชนิดของSO c ++ แชท

ดูเหมือนว่าพฤติกรรมนี้เกิดจากจุดบกพร่องใน gcc

วิธีแก้ปัญหาที่ให้ไว้ในความคิดเห็นสุดท้ายของการอภิปรายข้อบกพร่องนั้นได้ผลและแก้ไขปัญหาได้:

-Wl,--no-as-needed

8
ฉันจะทำอย่างไรถ้าไม่มี SO และผู้ชายอย่างคุณ? คุณช่วยฉันดึงผมหัวฟู ขอบคุณ :) สิ่งนี้คลุมเครืออย่างที่ได้รับ (อย่างน้อยสำหรับฉัน)
scorpiodawg

@scorpiodawg: ความคิดเห็นของคุณทำให้ตอนเย็นของฉันขอบคุณ :-)
zerkms

1
ฉันต้องเพิ่ม-pthread -lpthread -Wl,--no-as-neededค่าสถานะทั้งหมดเพื่อให้ได้งานนี้
ครัวซองต์ Paramagnetic

34

การเพิ่ม-lpthreadแก้ไขปัญหาที่เหมือนกันสำหรับฉัน:

 g++ -std=c++11 foo.cpp -lpthread -o foo

1
Jep นี่คือ anwser และสมเหตุสมผลด้วย "-Wl, - no-as-needed" ฟังดูแปลก ๆ และก็ไม่ได้ผลสำหรับฉันด้วย
thesaint

3
-lpthreadคุณต้องแน่นอน คุณอาจต้องใช้-pthread -Wl,--no-as-neededขึ้นอยู่กับเวอร์ชันของคอมไพเลอร์ gcc-4.8.2ต้องการมัน
cdunn2001

12

ฉันมีเวอร์ชันขั้นสูงกว่าเล็กน้อย (4.8.4 แทนที่จะเป็น 4.8.1) และฉันได้ทดสอบทั้งสามคำตอบข้างต้น ในความเป็นจริง:

-pthread ทำงานคนเดียว:

g ++ -std = c ++ 11 -o หลัก -pthread main.cpp

-Wl,--no-as-neededอยู่คนเดียวไม่ได้ทำงาน

-lpthreadอยู่คนเดียวไม่ได้ทำงาน

-Wl,--no-as-neededและทำงาน-lpthread ร่วมกัน :

g ++ -std = c ++ 11 -o หลัก -Wl, - ไม่จำเป็นต้องใช้ main.cpp -lpthread

เวอร์ชันของฉันคือ "g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4"


มีวิธีแก้ปัญหาสำหรับเวอร์ชันอื่นและฉันมั่นใจได้ว่าคำตอบที่ตรวจสอบใช้งานได้ในขณะที่ฉันตรวจสอบ ยังไงก็ขอบคุณสำหรับข้อมูลจริง
zerkms

9

คำตอบถูกสร้างขึ้นสำหรับ qtcreator แล้ว:

LIBS += -pthread
QMAKE_CXXFLAGS += -pthread
QMAKE_CXXFLAGS += -std=c++11

สำหรับคอนโซล g ++: ที่นี่

g++ -c main.cpp -pthread -std=c++11         // generate target object file
g++ main.o -o main.out -pthread -std=c++11  // link to target binary

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