Chinaunix

标题: pthread 子线程安全关闭进程 [打印本页]

作者: hongyunqi    时间: 2010-09-01 17:51
标题: pthread 子线程安全关闭进程
<Programming with POSIX thread>一书中提到了:在子线程中判定有严重错误,可以用exit退出整个进程。

我的测试:一个子线程执行exit,就会使其他线程coredump。
我的解释:exit会释放一些共享资源,而这些资源刚好就是其他线程要用的,所以会coredump。后来改成_exit(不会释放资源)就不会coredump了。

我的问题:怎样使子线程安全关闭整个进程?
作者: liwangli1983    时间: 2010-09-01 18:33
不知KILL自己成不成?我也不太清楚,等高手解答
作者: pengjianbokobe    时间: 2010-09-01 19:12
帮顶
作者: davelv    时间: 2010-09-01 20:02
向其他线程发出撤销pthread_cancel(),然后依次join(如果是分离状态的就不用了),直到其他线程都撤销掉了再exit()
作者: rain_fish    时间: 2010-09-01 20:30
子线程不能再主线程退出前退出,否则其他线程的一些资源还没有释放,可以用一些标志来让子线程退出,直到所有子线程退出后,主线程再退出。。。
作者: zzyong08    时间: 2010-09-01 21:53
我一直用4楼的方法,先cancel,然后join,等待所有的线程退出。
作者: hongyunqi    时间: 2010-09-01 23:58
4楼的方法我试下。

另外:有没有官方文档对这个问题的描述啊
作者: drangon    时间: 2010-09-02 08:27
cancel还是太暴力了,这个问题应该是应用业务逻辑的问题,最好的方法还是定义个程序退出的机制,当线程检测到致命错误,或者外部需要终止程序时,触发这个机制,然后主线程中检测这个机制,然后用合理方式通知各个线程退出,等待各线程退出之后,再优雅的退出整个进程
作者: davelv    时间: 2010-09-02 08:39
cancel还是太暴力了,这个问题应该是应用业务逻辑的问题,最好的方法还是定义个程序退出的机制,当线程检测 ...
drangon 发表于 2010-09-02 08:27


楼主说了哦,只有遇到严重错误的时候,才会要关闭整个进程。
作者: morocco    时间: 2010-09-02 10:35
楼主说了哦,只有遇到严重错误的时候,才会要关闭整个进程。
davelv 发表于 2010-09-02 08:39



    既然都严重错误,难道不该core吗?
作者: davelv    时间: 2010-09-02 12:40
回复 10# morocco
如何严重法,还需楼主界定吧。pthread_cancel()这个函数一直存在,也没有被标志为过时函数,就证明有它的用武之地阿。
作者: drangon    时间: 2010-09-02 13:35
有用武之地不代表能正确用好,与其写复杂的代码用好cancel,还不如通过清晰的应用逻辑来处理
作者: hongyunqi    时间: 2010-09-02 17:30
回复 8# drangon


    请问如何合理方式通知各个线程退出?
作者: hongyunqi    时间: 2010-09-02 17:33
不知为何
我用这种方式,还是会core
1 严重错误子线程pthread_exit
2 父线程cancel其他各个子线程
3 父线程join 其他各个子线程

没辙了, 只能使用_exit()暴力退出了。
作者: davelv    时间: 2010-09-02 17:50
不知为何
我用这种方式,还是会core
1 严重错误子线程pthread_exit
2 父线程cancel其他各个子线程
3 父 ...
hongyunqi 发表于 2010-09-02 17:33


是不是那个严重错误本身会导致coredump呢
作者: davelv    时间: 2010-09-02 17:52
有用武之地不代表能正确用好,与其写复杂的代码用好cancel,还不如通过清晰的应用逻辑来处理
drangon 发表于 2010-09-02 13:35

我明白你的意思,你是说有些函数容易被滥用。所以我们尽量在正确的范围内利用它。
关键是界定哪些属于正确范围。
作者: hongyunqi    时间: 2010-09-02 17:58
是不是那个严重错误本身会导致coredump呢
davelv 发表于 2010-09-02 17:50



    不是。我说的严重问题:我认为这个时候系统没有必要继续运行下去了
作者: drangon    时间: 2010-09-02 19:19
回复  drangon


    请问如何合理方式通知各个线程退出?
hongyunqi 发表于 2010-09-02 17:30


线程间通信啊,该怎样通信就怎样通信,正常业务功能的通信,以及这种退出通知的通信,所以关键还是在于逻辑设计。
作者: pengjianbokobe    时间: 2010-09-02 23:41
线程看来还得多学学啊
作者: youzlm    时间: 2010-09-03 10:22
本帖最后由 youzlm 于 2010-09-03 10:25 编辑

当客户端同时50个同时掉线的话,,服务器也会被关掉。
服务器要不要对掉线的用户关闭线程吗?
一个SOCKET对应一个线程
这是为什么?




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