У меня есть код на двух системах, работающих kernel 2.4.20
и kernel 2.4.38
. У них обоих есть gcc 3.2.2
иglibc 2.3.2
В соответствии с kernel 2.4.38
дескрипторы pthread _t не используются повторно. При тестировании с большой нагрузкой приложение падает, как только дескрипторы достигают 0xFFFFFFFF
.
(Я подозревал это в первую очередь из-за сбоя приложения в развертываниях, где ИТ-отдел использует сканер сетевых портов -, потоки создаются для обработки соединений через сокеты )
. Этот простой пример воссоздает проблему:
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
перерабатывать дескрипторы? К сожалению, я не могу легко изменить ядро. Спасибо!