gcc 4.8.1中c ++ 11线程的奇怪行为

时间:2013-12-15 12:57:11

标签: linux multithreading gcc c++11

这是我的代码。

#include <thread>
#include <iostream>
//#include <ctime>

using namespace std;

void f() {}

int main() {
    //struct timespec t;
    //clock_gettime(CLOCK_REALTIME, &t);
    thread(f).join();
    return 0;
}

我试图通过以下方式编译该程序:

1. g++ a.cc -o a -std=c++11 -pthread
2. g++ a.cc -o a -std=c++11 -lpthread
3. g++ -pthread a.cc -o a -std=c++11
4. g++ a.cc -c -std=c++11 && g++ a.o -o a -lpthread
5. g++ a.cc -c -std=c++11 -pthread && g++ a.o -o a -pthread

所有这些都可以输出可执行文件“a”。但是,它们似乎都没有链接库“libpthread.so”:

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

ldd ./a
linux-vdso.so.1 =>  (0x00007fff997fe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f350f7b5000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f350f59f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f350f1d6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f350eed2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f350fad4000)

但是,以下方式非常有效:

  1. 取消注释上述代码中的所有三行(必须执行此操作,否则会出现相同的错误);

  2. 使用“g ++ a.cc -std = c ++ 11 -o a -lrt”。

  3. 我正在使用ubuntu 13.10。有什么理由吗?

1 个答案:

答案 0 :(得分:1)

This would seem to be a known Ubuntu related bug

您可以(在链接页面上注明)通过在命令行上传递-Wl,--no-as-needed来解决它;

 > g++ a.cc -pthread -std=c++11
 > ./a.out
 terminate called after throwing an instance of 'std::system_error'
   what():  Enable multithreading to use std::thread: Operation not permitted
 >

 > g++ a.cc -pthread -std=c++11 -Wl,--no-as-needed
 > ./a.out
 >