Chinaunix

标题: 请高手指点!多线程问题! [打印本页]

作者: sky.liu    时间: 2008-11-22 14:58
标题: 请高手指点!多线程问题!
在一个图形程序中,我开了5个线程,其中一个异常退出了,是否会使整个程序推出,或者有这种可能。这5个线程都不涉及界面显示。

这是我对程序炸掉的一种猜测,不知道有没有可能。

基于以上猜测,由于不知道线程是怎么异常退出的,尝试几种简单的操作,没有产生预期效果。
作者: du51    时间: 2008-11-22 16:01
#include <stdio.h>
#include <stdlib.h>

int main()
{
        printf("%d\n", atoi(NULL));
        return 0;
}
作者: du51    时间: 2008-11-22 16:02
主线程异常退出了
其它同理
作者: nicozhou    时间: 2008-11-22 16:06
原帖由 sky.liu 于 2008-11-22 14:58 发表
在一个图形程序中,我开了5个线程,其中一个异常退出了,是否会使整个程序推出,或者有这种可能。这5个线程都不涉及界面显示。

这是我对程序炸掉的一种猜测,不知道有没有可能。

基于以上猜测,由于不知道线程是怎么异常退出的,尝试几种简单的操作,没有产生预期效果。


有可能,stack overflow的话,有可能导致整个系统挂掉。

你找找异常的原因吧,多数时候是因为内存/指针错误的原因
作者: xinglp    时间: 2008-11-22 18:32
valgrind检查
作者: samon_fu    时间: 2008-11-24 03:44
原帖由 sky.liu 于 2008-11-22 14:58 发表
在一个图形程序中,我开了5个线程,其中一个异常退出了,是否会使整个程序推出,或者有这种可能。这5个线程都不涉及界面显示。

这是我对程序炸掉的一种猜测,不知道有没有可能。

基于以上猜测,由于不知道 ...


个人认为:首先程序异常是指程序执行出错,作为一个大进程中的一个小线程来说,如果错了,那就意味着整个大进程肯定也错了。所以,其中一个“异常退出”,整个程序的执行也失去了意义,从逻辑上去思考的话,肯定是整个“进程”退出。当然,具体操作系统的实现不同系统有不同理解和实现的,从传统的进程、线程模型来从逻辑上去理解,那就是这样了。

其次要想程序异常退出很容易,你往地址0写点东西程序就肯定挂掉了,呵呵。
作者: alexhappy    时间: 2008-11-24 09:15
你哪里需要考虑多线程中的一个线程异常的话会导致什么,只用想想单线程情况下的状况就行了。。。。
任一线程异常均会导致整个进程的异常终止
作者: hellioncu    时间: 2008-11-24 10:35
可能而不是必然
作者: snick    时间: 2008-11-24 12:54
关键问题是是怎么异常退出的, 如果你捕获并处理了异常再退出, 是有可能让整个程序继续运行的
作者: sky.liu    时间: 2008-11-26 19:12
每个线程内部都采用try--catch结构,并没有捕获到异常,
每个线程stack,以及加上线程内函数调用,我可以确定不会超过1m。

我所做的程序,是个简单的网络通讯模型。

每个线程处理从网络接受的数据,线程是while(true)循环,处理数据。

在程序炸掉之前,我可以保证线程内部每个函数都正常运行过几遍。
作者: sky.liu    时间: 2008-11-26 19:16
还有就是没有往地址0写东西,这系统会有对话框提示吧!
作者: samon_fu    时间: 2008-11-26 22:35
标题: 回复 #11 sky.liu 的帖子
我说的往地址0写程序只是打个比方,就是说认为让一个线程挂掉后验证其他线程是否正常。

其实实际用多线程的情况一般是存在一个与主线程独立的事情时才分离出一个线程去执行的。

主线程只需要等子线程完成事情后收玉米就好了,如果子线程执行有问题或者什么不同的情况,再由主线程来处理的。

对于你说的“异常”,其程度我不是很清楚,如果是sagment fault错误的话,那应该整个程序都挂掉的。
作者: sky.liu    时间: 2008-11-27 10:33
我试了下,
我可以捕获到,类似
memcpy(0x0000,"123",sizeof("123"));
这种异常,而程序还可以运行。

顺便说下,我这个程序是在windows下运行的。
作者: sky.liu    时间: 2008-12-01 11:04
再顶起来,希望指点。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2