/*
* 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 */
void zwolnij_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);
return NULL;
}
//------------------------------------------------------------------------
int main() {
pthread_t id1;
pthread_t id2;
/* 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);
return EXIT_SUCCESS;
}
//------------------------------------------------------------------------