kernel 2.4.20
と を実行している 2 つのシステムでいくつかのコードを使用していますkernel 2.4.38
。彼らは両方とも持っていgcc 3.2.2
ますglibc 2.3.2
では、 pthread_tkernel 2.4.38
ハンドルは再利用されていません。高負荷テストでは、ハンドルが に達するとアプリケーションがクラッシュします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
ハンドルをリサイクルするにはどうすればよいですか? 残念ながら、カーネルを簡単に変更することはできません。ありがとう!