我在两个正在运行的系统上有一些代码,kernel 2.4.20
并且kernel 2.4.38
. 他们都有gcc 3.2.2
并且glibc 2.3.2
在 下kernel 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...
我怎样才能kernel 2.4.36
回收手柄?不幸的是我不能轻易改变内核。谢谢!