免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5312 | 回复: 7
打印 上一主题 下一主题

多线程程序(LINUX),DETACH方式如何使用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-24 19:29 |只看该作者 |倒序浏览
我在TurboLinux8下的一个多线程服务器myserver,每收到来自client的请求就创建一个线程,让这个线程去处理请求,处理完了创建的线程就退出。我希望线程退出的时候就能释放所占用的资源,所以使用了DETACH方式。

主程序相关代码如下:

pthread_attr_t g_attr; //全局变量

pthread_t pth;
pthread_t tid;
int ret = 0;

ret = pthread_create(&pth, &g_attr, (void *)func, parg);
if (ret)
{
return;
}

func()的开始增加了如下代码:
pthread_attr_init(&g_attr); pthread_attr_setdetachstate(&g_attr,PTHREAD_CREATE_DETACHED);
func()的结尾是用return 0,没有用pthread_exit。


实际运行中发现,刚启动server时,free mem是41M。每20秒发一个请求,free mem很快下降到3、4M左右,然后就在3M、4M左右徘徊。再运行几个小时后,server进程就被杀掉了,屏幕上出现:
__alloc_pages:0_order allocation failed (gfp=0x1d2/0)
VM:Killing process myserver
__alloc_pages:0_order allocation failed (gfp=0x1f0/0)
由于进程被杀掉时是在夜里,所以我也不知道当时的内存情况,难道是虽然已经维持了好几个小时都是3、4M,到最后仍然发生了无内存的情况,所以被杀掉了?

所以我想请问一下,我的多线程写法有什么问题吗?我认为func()内部malloc的内存我是在末尾free了的。另外,是不是线程退出必须用 pthread_exit?我是看一些文章说return也可以。另外就是TurboLinux上的多线程是不是有什么要特别注意的地方?或者说我对DETACH的使用有问题?

请各位不吝赐教,万分感谢。

论坛徽章:
0
2 [报告]
发表于 2005-02-25 08:09 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

pthread_attr_init(&g_attr); pthread_attr_setdetachstate(&g_attr,PTHREAD_CREATE_DETACHED);

应该在pthread_create()之前,
为验证,你可以在你的FUN()里面有pthread_attr_getdetachstat()看看你那句没有起作用.

论坛徽章:
0
3 [报告]
发表于 2005-02-25 14:17 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

谢谢柳五随风的指点。

由于我把g_attr设置为全局变量,所以pthread_attr_getdetachstate(&g_attr,&state)中可以得到state的值为PTHREAD_CREATE_DETACHED。
但是我确实不应该把g_attr的初始化放在pthread_create后面。我现在已经修改了这一点,但是内存方面的问题跟第一帖说的一样。是不是还要单独调用pthread_detach()函数啊?目前我的程序中所使用的pthread函数只有第一贴我列出来的pthread_attr_init、pthread_attr_setdetachstate、pthread_create。是不是还应该用别的什么pthread函数?

谢谢

论坛徽章:
0
4 [报告]
发表于 2005-02-25 14:25 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

>;>;是不是还要单独调用pthread_detach()函数啊?
越俎代庖答一句:应该不用了。这个函数一般都是我这样的懒人在线程刚创建时调用的:
pthread_detach(pthread_self());

论坛徽章:
0
5 [报告]
发表于 2005-02-25 18:31 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

唉,为什么我的多线程程序内存下降得这么快啊,我觉得线程里的资源我都释放了的。

论坛徽章:
0
6 [报告]
发表于 2005-02-25 22:39 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

1.always #include <pthread.h>; on the first line of your source code file, otherwise, you can not predict what could happen.
2.pthread_exit() works just like return, so no big deal if you use return instead of pthread_exit(), bu at least you should know that any file opened in the detached thread should be closed before you call any return function.
3.make sure you destroy all the mutextes and conditional variables before you return.
4.if you still can not fix this problem, maybe you should try using pthread_cleanup_push() and pthread_cleanup_pop(), meantimes, never call pthread_exit() from pthread_cleanup_pop() or class's destructor, these kind of actions were definitely not defined.
5.if you still got problem, then I suggest you using commercial debug tools such as insure++, which could hep you trace the runing  route.

good luck.

论坛徽章:
0
7 [报告]
发表于 2005-09-04 19:27 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

牛!

论坛徽章:
0
8 [报告]
发表于 2005-09-04 23:28 |只看该作者

多线程程序(LINUX),DETACH方式如何使用?

pthread_create 的第二个参数恐怕有库不一定支持,
简单的方法可以使用
pthread_detach(pthread_self());

另一个方法是
用2个LIST列表分别保存 运行中的线程,和已经退出的线程。
创建一个 工作线程专门用来 JOIN  已经退出的线程。
这样的好处是,在程序退出的时候,可以保障所有线程都已经退出了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP