Joinable ve Detachable Thread Türleri
Thread kullanılan bir uygulamada main()
fonksiyonundan return edilirse, tüm thread'ler de sonlandırılır ve kullanılan tüm kaynaklar sisteme geri verilir.
Aynı şekilde herhangi bir thread içerisinden exit()
benzeri bir komutla çıkış yapılması halinde gene tüm thread'ler sonlandırılacaktır.
pthread_join
fonksiyonu ile, bir thread'in sonlanmasını bekleyebiliriz. Bu fonksiyonun kullanıldığı thread, sonlanması beklenen thread sonlanana kadar bloklanacaktır.
Normal (joinable) thread'ler, sonlanmış olsa dahi pthread_join
ile join işlemine tabi tutulmazlar ise, CPU tarafından tekrar schedule edilmeseler de sistemden kullandığı kaynaklar geri verilmez
Detachable Thread
Bazen pthread_join
ile join işlemi yapmanın anlamlı olmadığı, thread'in ne zaman sonlanacağının öngörülemediği durumlar olabilir.
Bu durumda thread return ettiği noktada tüm kaynakların sisteme otomatik olarak geri verilmesini sağlayabiliriz.
Bunu sağlamak için ise, ilgili thread'leri, DETACHED durumu ile başlatmamız gerekmektedir.
Bir thread başlatılırken thread attribute değerleri üzerinden veya pthread_detach
fonksiyonu ile DETACH durumu belirtiebilir:
int pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
int pthread_detach(pthread_t thread);
pthread_join
Örneği
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void *worker(void *data)
{
char *name = (char*)data;
for (int i=0; i<120; i++) {
usleep(50000);
printf("Hello from thread %s\n", name);
}
printf("Thread %s done...\n", name);
return NULL;
}
int main(void) {
pthread_t th1, th2;
pthread_create(&th1, NULL, worker, "A");
pthread_create(&th2, NULL, worker, "B");
sleep(5);
printf("Exiting from main program\n");
pthread_join(th1, NULL);
pthread_join(th2, NULL);
return 0;
}