/* * Przykładowy program dla kursu "POSIX Threads" z wikibooks.pl * * Temat: funkcje finalizujące (cleanup) * * Autor: Wojciech Muła * Ostatnia zmiana: 2010-03-xx */
#include<stdlib.h>#include<stdio.h>#include<pthread.h>#include<errno.h>#include<unistd.h> // sleep#define test_errno(info) do {if (errno) {perror(info); exit(EXIT_FAILURE);}} while(0)/* funkcja finalizująca */voidzwolnij_pamiec(void*adres){printf("zwalnianie pamięci spod adresu %p\n",adres);free(adres);}//------------------------------------------------------------------------void*watek(void*id){char*tablica1=malloc(100);char*tablica2=NULL;printf("wątek #%d zaalokował 100 bajtów pod adresem %p\n",(int)id,tablica1);pthread_cleanup_push(zwolnij_pamiec,tablica1);if(tablica1){tablica2=malloc(200);printf("wątek #%d zaalokował 200 bajtów pod adresem %p\n",(int)id,tablica2);pthread_cleanup_push(zwolnij_pamiec,tablica2);if((int)id>0)/* wątek się kończy w tym punkcie, funkcje finalzujące zostaną uruchomione */pthread_exit(NULL);pthread_cleanup_pop(1);}pthread_cleanup_pop(1);printf("wątek #%d zakończył się\n",(int)id);returnNULL;}//------------------------------------------------------------------------intmain(){pthread_tid1;pthread_tid2;/* utworzenie 2 wątków */errno=pthread_create(&id1,NULL,watek,(void*)(0));test_errno("pthread_create (1)");errno=pthread_create(&id2,NULL,watek,(void*)(1));test_errno("pthread_create (2)");/* oczekiwanie na zakończenie */pthread_join(id1,NULL);pthread_join(id2,NULL);returnEXIT_SUCCESS;}//------------------------------------------------------------------------