Linux的多线程有什么需要特别注意的地方吗?
我在TurboLinux8下的一个多线程服务器,每收到来自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上的多线程是不是有什么要特别注意的地方?
请各位不吝赐教,万分感谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Why not call
pthread_attr_init(&g_attr) and pthread_attr_setdetachstate(&g_attr,PTHREAD_CREATE_DETACHED) before
pthread_create(&pth, &g_attr, (void *)func, parg) ?
谢谢星之孩子的指点。
由于我把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函数?
谢谢