2010-11-21 31 views
1

Çıkarılabilir oluşturduğum iş parçacıklarının, çıktıktan sonra belleklerini bırakmadıkları bir durumla karşılaşıyorum.Çıkarılmış iş parçacığı yığınını asla serbest bırakma

Aşağıdaki şekillerde

1-

pthread_attr_setdetachstate(&pthread_attributes, PTHREAD_CREATE_DETACHED); 
pthread_create(&thread_id, &pthread_attributes, establish_connection, 
       (void *) establish_connection_arguments); 

2-

pthread_create(&thread_id, &pthread_attributes, establish_connection, 
       (void *) establish_connection_arguments); 
pthread_detach(thread_id); 

3-

içinde parçacıklarını oluşturma çalıştık pmap bu doğrular olarak
pthread_create(&thread_id, &pthread_attributes, establish_connection, 
       (void *) establish_connection_arguments); 

void *establish_connection(void *arguments) { 
    pthread_detach(pthread_self()); 
    return NULL; 
} 

Ben, bellek hala korunur eminim.

Normal davranış, iş parçacığı tamamlandıktan sonra bu pmap, iş parçacığı bellekleriyle hala gösterecek mi?

cevap

0

Varsayılan olarak, glibc/nptl bunları yeniden kullanmak için iş parçacığı yığınlarını önbelleğe alır. Bu, önbellek listesinden öğe eklemek/kaldırmak ve önemli olmayan (ama umarım büyük değil) bellek maliyeti için küçük bir eşitleme maliyetine neden olur, ancak bir iş parçacığı oluşturulduğunda veya imha edildiğinde mmap ve munmap çağrılarının maliyetini önler. Bu varsayılan davranışı aşırı derecede kırılgan bilgisayar korsanlığı olmadan değiştirmenin bir yolu olduğundan şüphelenmiyorum.

Düzenleme: Birleştirilebilen iş parçacıklarının yayınlanmaya başladığını söylediğinden beri, işte benim ikinci tahminim: Bir iş parçacığının kendi yığınını serbest bırakması çok zordur. işini yaparken onun yığınını serbest bırakmak. munmap syscall'ı perorm etmek için bir yığına ihtiyaç duymayan asm yazmayı ve sonra kendi kendini sonlandırma ile bu sınırlamayı aşmak mümkün olabilir, ancak bunu bir uygulama olarak görmedim.

0

Büyük olasılıkla, bellek ayırıcısı kullanımda olan bellek alanı tarafından önbelleğe alınır. Tuhaf ipliği çalıştırmak ve bellek kullanımının olmaması daha sonra bir sızıntı belirtisi olmamasına rağmen - birçok iş parçacığını tekrar tekrar açmanız ve kapatmanız, daha sonra işlem belleği kullanımını kontrol etmeniz gerekir.

0

pmap programı, işlemin bellek haritasını gösterir. Bu bellek hala süreç tarafından kullanılıyor. Örneğin, başka bir iş parçacığı oluşturulduysa, bu bellek yığını için kullanılabilir.

İlgili konular