kernel 2.4.20
ve kernel 2.4.38
ile çalışan iki sistemde bazı kodlar var. kernel 2.4.38
altında Her ikisi de var gcc 3.2.2
ve glibc 2.3.2
linux kernel'de pthread_create farkları 2.4.20 ve 2.4.36
, pthread_t kolları yeniden edilmiyor. Ağır yük testi altında, tutamaçlar 0xFFFFFFFF
'a ulaştığında uygulama çöküyor.
Bu basit örnek sorunu yeniden
(BT parçacığı tarayıcıları ve bir ağ portu kullanan dağıtımlarda uygulama kilitleniyor soket bağlantılarını işlemek için oluşturulan çünkü ilk etapta bu şüpheli) 2.4.20 altındavoid* 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;
}
:
Created 0x40838cc0
Thread 0x40838cc0
Created 0x40838cc0
Thread 0x40838cc0
Created 0x40838cc0
Thread 0x40838cc0
...and on and on...
2.4.36 altında:
Created 0x4002
Thread 0x4002
Created 0x8002
Thread 0x8002
Created 0xc002
Thread 0xc002
...keeps growing...
kernel 2.4.36
geri dönüş tutamaçlarını nasıl alabilirim? Maalesef çekirdeği kolayca değiştiremiyorum. Teşekkürler!
Geçmişe selamlar! Böyle bir çekirdek davranışta programınıza bağlı olarak iyi bir fikir olduğunu düşünmüyorum, programınızı düzeltmeniz gerekir. – PlasmaHH
@PlasmaHH: Program gayet iyi; 'pthread_join' tüm iş parçacığı kaynaklarını serbest bırakmalıdır. Sorun şu ki, o çekirdek sürümde, görünüşe göre değil. –
@MikeSeymour: Sence bunu ne düşünüyorsun? Bana göre, her defasında farklı bir tutamaç veriyormuş gibi gözüküyor, bir önceki tutamaç boşaldığında bile mükemmel bir şey. Aynen a = malloc (5) gibi, serbest (a) a = = malloc (5); doğru olmamalı. – PlasmaHH