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

c–pthread_create linux内核2.4.20和2.4.36的差异,第1张

概述我在运行内核2.4.20和内核2.4.38的两个系统上有一些代码.他们都有gcc 3.2.2和glibc 2.3.2在内核2.4.38下,pthread_t句柄不会被重用.在负载测试下,一旦句柄达到0xFFFFFFFF,应用程序就会崩溃.(我首先怀疑这是因为应用程序在IT使用网络端口扫描程序的部署中崩溃 - 创建了用于处理套接字连接的线程)这个简单的例子重现

我在运行内核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).这可能是更好的解决方案. 总结

以上是内存溢出为你收集整理的c – pthread_create linux内核2.4.20和2.4.36的差异全部内容,希望文章能够帮你解决c – pthread_create linux内核2.4.20和2.4.36的差异所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存