среда, 23 июня 2010 г.

Pthread's hint !

Заметка эта появилась благодаря курсу "Многопоточное программирование с использованием POSIX Threads" на сайте Решил просмотреть курс , думал не найду ничего нового для себя - и вот нашел :)

В заметке речь пойдет о использовании pthread_exit (), вернее о том, что ведет эта ф-я на разных платформах по разному !

Пример :

#include  
#include  
#include  

class TestClass { 
  public:    
  int value; 
  TestClass(int parameter) { 
    std::cout << "Constructed " << parameter << "\n"; 
    value=parameter; 
  } 
  ~TestClass() { 
    std::cout << "destructed " << value << "\n"; 
  } 
}; 

extern "C" { 
  void *body_forexit(void * param) { 
    TestClass a(1); 
    sleep(1); 
    pthread_exit((void *)a.value); 
    return (void *)a.value; 
  } 

  void *body_forreturn(void * param) { 
    TestClass b(2); 
    sleep(2); 
    return (void *)b.value; 
  } 
} // extern "C" 

int main() { 
  pthread_t thread1, thread2; 
  
  pthread_create(&thread1, NULL, body_forexit, NULL); 
  pthread_detach(thread1); 
  pthread_create(&thread2, NULL, body_forreturn, NULL); 
  pthread_detach(thread2); 
  pthread_exit(NULL); 
  return 0; 
} 

итог запуска скомпилированной проги на разных платформах :
Linux desktop 2.6.28-15-generic #49-Ubuntu SMP Tue :
andrey@desktop:~/dev/threads$ ./a.out Constructed 1 Constructed 2 destructed 1 destructed 2
7.0-RELEASE FreeBSD :
Constructed Constructed 1 2 destructed 2

И того - на фре7 при использовании pthread_exit НЕ ВЫЗЫВАЮТСЯ ДЕСТРУКТОРЫ !!!!!!!
А в линуксе ВЫЗЫВАЮТСЯ !!!
Имхо правильнее использовать ретурн , чтоб небыло неожиданности :)

Комментариев нет:

Отправить комментарий