28 Mart 2017 Salı

pthread_create metodu

Giriş
İmzası şöyle
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);
pthread_create metodu ile yeni bir thread yaratılır.
1. parametre thread nesnesini saklamak içindir. Yani "out" parametresidir.
2. parametre thread'e geçilmek istenen pthread_attr nesnesini belirtir. Genelde NULL kullanılır. Açıklaması şöyle
The attr argument points to a pthread_attr_t structure whose contents
are used at thread creation time to determine attributes for the new
thread; this structure is initialized using pthread_attr_init(3) and
related functions.  If attr is NULL, then the thread is created with
default attributes.
3. parametre thread'in  ana metodunu belirtir.
4. parametre thread'e ilave veri geçmek için kullanılır.

Klasik kullanımı şöyledir.
pthread_create (&t, NULL, threadMain, NULL);
Şöyle bir ana thread metodumuz olsun
void *testThread (void *pParm){...}
Bu metodu herhangi bir şeye cast etmemize gerek yok. Yani şöyle yapmak gereksiz.
pthread_create(&t, NULL, (void *)threadMain, NULL);
Şöyle çağırırız.
pthread_create (&t, NULL, threadMain, NULL);
lambda kullanmak istersek şöyle yaparız.
pthread_create (&t, NULL, [](void* ptr){
  ...; 
  return (void*)nullptr;
}, NULL);
2. parametre pthread_attr yapısı
pthread_attr yapısı yazısına taşıdım.

3. thread'in ana metodu
thread'in ana metodunu belirtiriz.İmzası şöyledir. void* döner ve parametre olarak void* alır.
void *myThread (void *arg) {
  ...
  return nullptr;
}
metod null dönmek zorunda değildir. Bir nesne dönmek istersek şöyle yaparız.
struct threadresult {
  int sum;
  int product;
};

void* myThread (void* arg) {
  ...
  struct threadresult* result = malloc(sizeof(*result));
  result->sum = ...;
  result->product = ...;

  return result;
}
4. parametre Thread'e İlave Veri geçmek
pthread_create() metodunun 4. alanı, başlatılan thread'e geçilmek istenen parametre. Eğer birden fazla parametre geçilmesi gerekiyorsa bir struct şeklinde geçilebilir. Şöyle bir struct'ımı olsun
struct dimension {
  unsigned int width;
  unsigned int height;
};
Parametrenin thread başlamadan önce yok olmaması gerekir. Dolayısıyla eğer gerekiyorsa önce struct'ı heap üzerinde yaratır, daha sonra thread'e parametre olarak geçerim.
// Pass a struct in pthread_create (NOT on the stack)
struct dimension *dim = new dimension();
dim->width = 1;
dim->height = 2;

pthread_create(&ph, &attr, myThread, dim);
Thread metodu void pointer aldığı için parametreyi struct'a cast ederek  kullanabilir.
void *myThread(void* dimension) {

  struct dimension* dim = (struct dimension*) dimension;
  //Do work
    
  return 0;
}
Gerekiyorsa parametre thread'den çıkarken yok edilir. Şöyle yaparız.
void* myThread (void* dimesion) {
  // Get thread args in usable type.
  struct dimension* dim = (struct dimension*) dimension;  ...

  delete dim;  return 0;
}

Hiç yorum yok:

Yorum Gönder