2012-05-13 36 views
5

döndükten sonra siliniyor Bir ana iş parçacığım ve dosya çıktılarını gerçekleştirmek için bir daemon iş parçacığım bulunan bir proje üzerinde çalışıyorum. Benim ana iş parçacığımda silmek istediğim bir alan pthread_t * _daemon var, ama açıkça sadece _daemon NULL döndürdüğünde (pthread_exit() kullanarak bellek sızıntıları neden olduğunu anlıyorum).Bir daemon iş parçacığı yalnızca

Meşgul beklemeden nasıl yapabilirim? Bir koşul değişkeni kullanmayı denediğimde sorun yaşıyorum - Ana iş parçacığı uyandırmak için signal() formu _daemon çağırdığımda, _daemon NULL döndürmeden önce _daemon siler.

Yaptığım şey, program başlatıldığında kilitlenen ve _daemon döndürmeden önce kilidi açılmış bir muteks kilidini kullanmak. Meşgul beklemeye neden olmaz daha iyi bir yolu var mı?

+1

'pthread_join'? – Mat

+0

Ne sorduğun belli değil. Tam olarak silmek istediğiniz nedir? –

+0

pthread_t alanı, ancak burada depolanan iş parçacığı yalnızca – yotamoo

cevap

5

pthread_detach(), sizin için ne yapar. Sorununuzu (sızıntı yok) çok daha az karmaşıklıkla çözecek gibi görünüyor!

pthread_detatch(_daemon), iş parçacığı ile işiniz bittiğinde, iş parçacığının hala çalışıp çalışmadığı konusunda endişelenmenize gerek kalmadan güvenle arama yapabilirsiniz. iş parçacığını sonlandırmaz, iş parçacığı sonlandırıldığında iş parçacığının temizlenmesini sağlar. belgelerine

:

pthread_detach() fonksiyon uygulanması iplik iplik için bu depolama için belirtecektir zaman o iplik sona erer ıslah edilebilir. Eğer iş parçacığı sonlandırılmamışsa, pthread_detach() 'a son vermemelidir.

Aslında bir attr ayarlayarak başlamak müstakil halde bir iş parçacığı oluşturabilir:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

uygun yaratılış zaman. pthread_create() manpage diyor ki:

bir müstakil iplik sonlandırır

, onun kaynakları otomatik sistem geri serbest bırakılır. [ snip] Ayrılmış bir iş parçacığı oluşturmak, çıkış durumu uygulamanın dikkat etmesi gerekmeyen bazı tiplerde iş parçacıkları için kullanışlıdır. varsayılan olarak, olarak ayarlanmışsa, iş parçacığı kopmayacak bir durumda yeni bir iş parçacığı oluşturulur (pthread_attr_setdetachstate (3) kullanarak).

+0

Ama serbest bırakmak istediğim _deamon, ana iş parçacığında değil, daemon dizisinde değil. Bu alanı yalnızca, daemon iş parçacığı – yotamoo

+2

@yotamoo: A 'pthread_t' nesnesini sonlandırdıktan sonra silmek, ilişkili iş parçacığı döndürmeden veya aksi takdirde yapılmadan silinebilir. İş parçacığının kendisi 'pthread_t' nesnesine dayanmaz - 'pthread_t' nesnesinin silinmesi ilişkili iş parçacığını yok etmez. Ancak, iş parçacığı döndürdüğünde veya çıkarıldığında, tüm iş parçacığı kaynaklarını temizleyebildiğini bilmesi için 'pthread_detach() 'ı çağırmanız gerekebilir. –

+0

Tam olarak "pthread_t nesnesini sil" ifadesi ne anlama geliyor? – alk

1

pthread_t bir unsigned long int, yani gerçekten (siz de o pthread fonksiyonlarda adresim kullanabilirsiniz) pthread_t bir işaretçi yapmak için bir gerek görmüyorum ama eğer ısrar, o zaman sonra silebilirsiniz Bir pthread oluşturmak (ancak daha sonra onunla iletişim kurmanın hiçbir yolu yoktur, çünkü bir dizi oluşturulmuş iş parçacığı - birleştirmek, ayırmak için kullanılan işlevler vb.).

İlgili konular