【问题标题】:C++11 thread error runtimeC++11 线程错误运行时
【发布时间】:2013-10-14 11:19:06
【问题描述】:

您好,我在 C++11 中遇到了线程问题。我有 ubuntu 64bit 13.10(testing) 和 g++ 4.8.1。 我尝试编译代码:

#include <thread>

void func()
{
   // do some work
}

int main()
{
   std::thread t(func);
   t.join();
   return 0;
}

带有选项:-std=c++11 -pthread -lpthread。编译成功,但是当我尝试运行它时,我收到了一个错误:

在抛出 'std::system_error' 实例后调用终止
what(): 启用多线程以使用 std::thread: 操作不 允许

【问题讨论】:

标签: c++ multithreading c++11


【解决方案1】:

我认为其他答案有点误导。重要的是您只需要-pthread这个标志的顺序重要!

-pthread 将自动与libpthread 链接,并且会正确链接。请注意,您需要在编译链接您的代码时都提供此选项(当然,同时执行所有操作时除外)。

仅当您明确提供-lpthread 时,您放置位置的顺序可能很重要,但如前所述,您不应在使用-pthread 时明确添加它。

【讨论】:

  • 在这种情况下使用 -pthread 不会有帮助。我的环境一样,唯一的解决办法是this
【解决方案2】:

您可能遇到与此处提到的相同的问题:
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1228201

将此标志添加到您的命令行。它将强制 g++ 与给定的库链接。

-Wl,--no-as-needed

【讨论】:

    【解决方案3】:

    似乎顺序很重要,或者至少,这就是这个线程中所说的: C++ Threads, std::system_error - operation not permitted?

    【讨论】:

    • 正确。我从来不知道为什么确切地,但是这个解释它:stackoverflow.com/questions/18827938/… 基本上,如果你在需要库的文件之前使用-lwhatever before,链接器会丢弃它因为到目前为止它没有看到任何使用的符号。
    • 是的,链接库必须位于需要它的文件的右侧。但这真的是 OP 的问题吗?似乎其他人在 Ubuntu 13.10 上也有同样的问题。
    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 2015-09-10
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多