12

我尝试在 Eclipse 中测试 C++11 线程的示例。但是我在运行程序时收到了这条消息:

在抛出“std::system_error”的实例后调用终止 what(): Operation not allowed'

我的系统:ubuntu + gcc 4.7

程序:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "hello from worker" << std::endl;
}

int main(int argc, char **argv)
{
    std::thread t(worker);
    t.join();
}

...是的,我把-std=c++11and-pthread放在里面C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags

任何意见?

4

3 回答 3

11

Jonathan Wakely 的评论解决了这个问题。

我添加-pthreadC/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags并且程序正常工作。

谢谢乔纳森。

于 2012-05-05T07:50:17.613 回答
1

要在 Eclipse 中使用 C++11 std::thread,需要-pthread在编译时提供选项。然而这还不够。在我的 Ubuntu 14.04 中,使用 Eclipse Kepler 和下面的 g++4.9 使其工作:

  1. 右键单击项目并选择“属性”
  2. 转到“C/C++ 构建”>“设置”>(选项卡)“工具设置”
  3. 首先选择'Cross G++ Compiler' > 'Miscellaneous' > 'Other flags';
    并在 -pthread之后添加-std=c++11
  4. 第二次选择“Cross G++ Linker”>“Libraries”;
    并添加pthread(相当于命令行-lpthread

最后重新编译项目;错误应该消失。

还要记住,如果你使用,std::thread那么它的对象必须在join()某个地方。否则您可能会遇到以下运行时错误:

在没有活动异常的情况下调用终止

于 2014-07-24T12:51:16.253 回答
1
  1. 转到Project > Properties > C/C++ General > Preprocessor include paths, etc > Providers > CDT GCC Builtin Compiler Settings并附-std=c++11加到编译器规范。

    您还可以对所有进入Window > Preferences > C/C++ > Build > Settings > Discovery的项目执行此操作,并附-std=c++11加到CDT GCC 内置编译器设置规范。

     ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}"
    
  2. Project Properties > C/C++ Build > Settings > Tool Settings > GCC C++ Compiler > Miscellaneous > Other flags,添加-pthread -std=c++11 -Wl,--no-as-needed

     -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed
    
  3. Project Properties > C/C++ Build > Settings > Tool Settings > GCC C++ Linker > Miscellaneous > Linker flags,添加-pthread -std=c++11 -Wl,--no-as-needed

     -pthread -std=c++11 -Wl,--no-as-needed
    
于 2016-10-26T11:50:30.470 回答