Linux的多线程有什么需要特别注意的地方吗?

发布于 2022-10-02 21:00:18 字数 1290 浏览 34 评论 0

我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

佞臣 2022-10-09 21:00:18

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) ?

捎一片雪花 2022-10-09 21:00:18

谢谢星之孩子的指点。

由于我把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函数?

谢谢

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文