C++ 多线程中的一个抛出异常

试了一下,和Java完全不同。

注意Java和C++对于多线程里面的一个线程抛出异常的影响,完全不同。

Java里面,对于主线程和其他线程完全不受影响;

C++里面,整个程序会退出,所有线程都会受影响。

Java的多线程与异常的关系,可以看这里:http://www.cnblogs.com/charlesblc/p/6175617.html

C++实验,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

using namespace std;

#define NUM_THREADS 5

void* proca(void*)
{
    printf("In ProcA\n");
    sleep(5);
    printf("ProcA: Try Throw...\n");
    throw 3;
}
void* procb(void*)
{
    printf("In ProcB\n");
    //printf("ProcA: Try Throw...\n");
    //throw 4;
}

int main()
{
    pthread_t tids[NUM_THREADS];
    printf("In Main Thread.\n");
    int ret = pthread_create( &tids[0], NULL, proca, NULL);
    printf("ProcA Started.\n");
    ret = pthread_create( &tids[1], NULL, procb, NULL);
    printf("ProcB Started.\n");

    sleep(10);
    printf("Start joining A\n");
    pthread_join(tids[0], NULL);
    printf("Start joining B\n");
    pthread_join(tids[1], NULL);

    return 0;
}

编译命令:

g++ -g -o try try.cpp -lpthread

运行:

$ ./try
In Main Thread.
ProcA Started.
In ProcA
ProcB Started.
In ProcB
(注意这里停顿大约5秒)
ProcA: Try Throw...
terminate called after throwing an instance of ‘int‘
Aborted (core dumped)

调试core dump:

$ gdb -c core.13689 ./try
GNU gdb Red Hat Linux (6.3.0.0-1.96rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0x7fff9d3ff000
Core was generated by `./try‘.
Program terminated with signal 6, Aborted.
Reading symbols from /lib64/tls/libpthread.so.0...done.
Loaded symbols for /lib64/tls/libpthread.so.0
Reading symbols from /usr/lib64/libstdc++.so.6...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/tls/libm.so.6...done.
Loaded symbols for /lib64/tls/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/tls/libc.so.6...done.
Loaded symbols for /lib64/tls/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
#0  0x0000003f0b02e2ed in raise () from /lib64/tls/libc.so.6
(gdb) bt
#0  0x0000003f0b02e2ed in raise () from /lib64/tls/libc.so.6
#1  0x0000003f0b02fa3e in abort () from /lib64/tls/libc.so.6
#2  0x0000003f0bfb1138 in __gnu_cxx::__verbose_terminate_handler () from /usr/lib64/libstdc++.so.6
#3  0x0000003f0bfaf166 in __cxa_call_unexpected () from /usr/lib64/libstdc++.so.6
#4  0x0000003f0bfaf193 in std::terminate () from /usr/lib64/libstdc++.so.6
#5  0x0000003f0bfaf293 in __cxa_throw () from /usr/lib64/libstdc++.so.6
#6  0x00000000004007ee in proca () at try.cpp:15
#7  0x0000003f0b90610a in start_thread () from /lib64/tls/libpthread.so.0
#8  0x0000003f0b0c5ee3 in clone () from /lib64/tls/libc.so.6
#9  0x0000000000000000 in ?? ()
(gdb) 

其中飘红的地方就是抛出异常的地方。

时间: 2024-11-15 09:43:12

C++ 多线程中的一个抛出异常的相关文章

c#多线程中Lock()关键字的用法小结

本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待. 每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生.

多线程中的&quot;断点&quot;续传《notify()和wait()》

目前在做一个项目,关于软件管理与下载的,估计项目提交日期定在6月9号.项目做了有20天了,但是在一个功能上卡住了.在这个项目中有一个功能----APK的下载需要实现.相信大家都玩过很多关于下载APK的软件,在这个下载功能上,应该能够清楚的知道有:断点续传:也就是当你点击下载之后的下载过程中,可以点击暂停来临时控制此时要不要继续下载.当点击继续下载的时候,这个软件会接着暂停之前的进度继续下载. 由于第一次接触这种功能的实现,在网络上搜索到的都是使用Sqlite来记录下载的进度,然后通过sqlite

多线程中volatile关键字的作用

原文链接:https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写.难验证.难调试.难维护,这通常是件苦差事.不正确的多线程程序可能可以运行很多年也不出一点错,直到满足某些临界的条件时,才出现意想不到的奇怪错误. 不用说,编写多线程程序的程序员需要使用可能得到的所有帮助.这期专栏将专注于讨论竞争条件(race conditions)——这通常是多线程程序中各种麻烦的根源——深入了解它并提供一些工具来防止竞争

c#语言-多线程中的锁系统

介绍 平常在多线程开发中,总避免不了线程同步.这次就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 二: mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.Wri

Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过start方法启动线程--->线程变为可运行可执行状态,然后通过数据产生共享,线程产生互斥---->线程状态变为阻塞状态---->阻塞状态想打开的话可以调用notify方法. 这里Java5中提供了封装好的类,可以直接调用然后构造阻塞状态,以保证数据的原子性. 2.如何实现? 主要是实现Blo

python多线程中锁的概念

python的锁可以独立提取出来 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 概念 好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 import thr

编写高质量代码改善C#程序的157个建议——建议66:正确捕获多线程中的异常

建议66:正确捕获多线程中的异常 多线程的异常处理需要采用特殊的方式.一下这种方式会存在问题: try { Thread t = new Thread((ThreadStart)delegate { throw new Exception("多线程异常"); }); t.Start(); } catch (Exception error) { MessageBox.Show(error.Message + Environment.NewLine + error.StackTrace);

【JAVA多线程中使用的方法】

一.sleep和wait的区别. 1.wait可以指定时间,也可以不指定. 而sleep必须制定. 2.在同步的时候,对于CPU的执行权和以及锁的处理不同. wait:释放执行权,释放锁. sleep:释放执行权,不释放锁. 二.线程是否安全? 1 class Test implements Runnable 2 { 3 public synchronized void show() 4 { 5 try 6 { 7 wait(); 8 } 9 catch (InterruptedExceptio

多线程中避免使用信号量

项目中遇到一个bug,因为接入了几家越狱平台:91.同步推.PP助手,在设备上安装了三个应用,启用其中任意一个,另外二个启动后无法创建发送socket消息,从而导致游戏直接死在登录那里,再次点击登录时线程才会被唤醒(无法发送的原因定位到,是因为在调用sem_post方法后无法将线程唤醒).之后我尝试将信号量改为条件变量,就再也没有遇到那个问题了.具体改写的几个方法: sem_open/sem_init => pthread_cond_init sem_close/sem_destroy =>