g++编译出的多线程程序出错“segmentation fault"



g++编译出的多线程程序出错“segmentation fault"

我使用的g++版本是g++ 4.4.3

升级到4.7版本:
add-apt-repository ppa:ubuntu-toolchain-r/test
apt-get update
apt-get install gcc-4.7-base
apt-get install gcc-4.7
apt-get install g++-4.7

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
update-alternatives --config gcc

重新编译:
g++ -std=c++0x A.cpp -o a
再次运行./a或者/tmp/a
再次错误:terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted
解决方法:
g++ -std=c++0x -pthread A.cpp -o a
再次运行./a或者/tmp/a
运行成功:
Launched from the main
Launched by thread 3
Launched by thread 4
Launched by thread 5
Launched by thread 6
Launched by thread 7
Launched by thread 8
Launched by thread 9
Launched by thread 2
Launched by thread 1
Launched by thread 0

代码例子:

#include <iostream>
#include <thread>

     static const int num_threads = 10;

     //This function will be called from a thread

     void call_from_thread(int tid) {
         std::cout << "Launched by thread " << tid << std::endl;
     }

     int main() {
        std::thread t[num_threads];

         //Launch a group of threads
         for (int i = 0; i < num_threads; ++i) {
             t[i] = std::thread(call_from_thread, i);
         }

         std::cout << "Launched from the main\n";

         //Join the threads with the main thread
         for (int i = 0; i < num_threads; ++i) {
             t[i].join();
         }

         return 0;
    }

代码来源:https://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/

时间: 2024-10-31 01:15:10

g++编译出的多线程程序出错“segmentation fault"的相关文章

stringbuilder-太没有道理了,g++编译这么简单的程序出现错误:‘string’不是一个类型名

问题描述 太没有道理了,g++编译这么简单的程序出现错误:'string'不是一个类型名 using namespace std;#include templateclass tree_node_t{public: string &to_string(string *result int prefix = 0); void set_data(const T &data); protected: T m_data;}; vs编译得好好的,g++怎么了,老是这些莫名其妙的错误?哪位高手能看出端

启动时celery worker出错”Segmentation fault” (core dumped)解决方法

在我的Ubuntu 14.04 上, 使用"celery worker"命令启动celery worker时,遇到"Segmentation fault" (core dumped),如下: jay@jay-linux:~/workspace/aew$ celery -A aew worker  代码如下 复制代码  -------------- celery@jay-linux v3.1.13 (Cipater) ---- **** ----- --- * ***

命令行登录mysql提示Segmentation fault解决办法

使用时报错如下 [root@localhost bin]# ./mysql -uroot -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.6.24 Source distribution Copyright (c) 2000, 2015, Oracle and/or its affiliates

qte4 5 3-qte4.5.3编译opencv显示图像程序出错

问题描述 qte4.5.3编译opencv显示图像程序出错 用qte4.5.3 make一个简单的opencv显示图像程序时,出现错误:/usr/local/lib/libopencv_calib3d.so:could not read symbols:Invalid operation 具体的.pro工程文件如下: QT+= core QT-=gui TARGET=opencvqt // 工程文件名 CONFIG+=console CONFIG-=app_bundle CONFIG+=link

mac os x-mac下编译GTK+3.0的“Hello,World”程序出错

问题描述 mac下编译GTK+3.0的"Hello,World"程序出错 我用homebrew下载安装好了gtk+3,然后试着编译了一个网上的示例代码: #include <stdio.h> #include <stdlib.h> #include <gtk/gtk.h> static gboolean delete_event(GtkWidget * widget, GdkEvent * event, gpointer data) { gtk_ma

linux-qt上编译opencv程序出错

问题描述 qt上编译opencv程序出错 编译提取棋盘格角点的的程序,但是一直显示cvFindChessboardCorners这个函数有问题,请大神指教! 错误如下: ../qt_subpix1/main.cpp: In function 'int main(int, char**)': ../qt_subpix1/main.cpp:14:19: warning: deprecated conversion from string constant to 'char*' [-Wwrite-st

64位系统下用vs2012 编译qt程序,请问怎么编译出在32位系统可以运行的程序

问题描述 64位系统下用vs2012 编译qt程序,请问怎么编译出在32位系统可以运行的程序 我现在想把写好的qt程序打包,但是在32位系统上跑不起来, 然后我编译时把平台改为win32,又提示无法编译,编译失败, 请问在64位windows系统怎么编译出可以在32位系统运行的程序 解决方案 需要在编译设置里面修改一些条件编译的参数. 解决方案二: 需要设置编译选项 或直接运行32位的gcc编译系统

使用vb.net有可能通过exe文件反编译出程序原码吗

问题描述 已有exe文件,但没有原码,能够实现使用vb.net反编译出程序原码吗? 解决方案 解决方案二:如果只是想使用里面的方法,可以试试反射,不过效率不高.解决方案三:所以说还不如写个程序方便了?解决方案四:帮不上了,帮顶吧--解决方案五:好象很难吧解决方案六:个人觉得应该不可以吧java好像才可以解决方案七:引用5楼semp010的回复: 个人觉得应该不可以吧java好像才可以 解决方案八:reflector,不过不是很准确,有的地方需要修改一下才可以解决方案九:引用7楼vwxyzh的回复

利用C#线程窗口调试多线程程序

  从网上的资料判断,调试多线程程序似乎就一下3种方法. 1.在日志的某个地方写日志文件. 优点:不会干扰程序的执行,特别是对网络的多线程通信. 缺点:每次都需要打开日志文件以查看进程运行的信息. 2.利用断点进行调试. 优点:直观,可以直接看到运行过程的值 缺点:在多个线程设置断点,可能让程序跳来跳去,还需要额外地分出一部分精力用来理清程序的逻辑 3.利用弹出窗口来查看进程调试的信息. 优点;直观 缺点;在调试网路通信的时候,使得通信的过程产生延时,导致通信失败. 4.利用vs2010自带的线