微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – pthread_create linux内核2.4.20和2.4.36的差异

我在运行内核2.4.20和内核2.4.38的两个系统上有一些代码.
他们都有gcc 3.2.2和glibc 2.3.2

在内核2.4.38下,pthread_t句柄不会被重用.在负载测试下,一旦句柄达到0xFFFFFFFF,应用程序就会崩溃.

(我首先怀疑这是因为应用程序在IT使用网络端口扫描程序的部署中崩溃 – 创建了用于处理套接字连接的线程)

这个简单的例子重现了这个问题:

void* ThreadProc(void* param)
{
    usleep(10000);
    printf(" Thread 0x%x\n",(unsigned int)pthread_self());
    usleep(10000);
    return NULL;
}

int main(int argc,char* argv[])
{
    pthread_t sThread;

    while(1)
    {
      pthread_create(&sThread,NULL,ThreadProc,NULL); 
      printf("Created 0x%x\n",(unsigned int)sThread);  
      pthread_join(sThread,NULL);
    };

    return 0;
}

在2.4.20下:

    Created 0x40838cc0
     Thread 0x40838cc0
    Created 0x40838cc0
     Thread 0x40838cc0
    Created 0x40838cc0
     Thread 0x40838cc0
...and on and on...

根据2.4.36:

    Created 0x4002
     Thread 0x4002
    Created 0x8002
     Thread 0x8002
    Created 0xc002
     Thread 0xc002
...keeps growing...

如何让内核2.4.36回收句柄?不幸的是我无法轻易改变内核.
谢谢!

最佳答案
如果您的观察结果正确,则只存在两种可能的解决方

>升级内核.这对您来说可能是也可能不可行.
>在应用程序中回收线程.

即使内核行为不端,也可以使用选项2.您可以保留一个未使用时保持睡眠状态的线程池.线程池是一种广为人知的软件工程模式(见http://en.wikipedia.org/wiki/Thread_pool_pattern).这可能是更好的解决方案.

原文地址:https://www.jb51.cc/linux/440526.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐