POSIX Threads/Przykładowe programy/Program 5

Z Wikibooks, biblioteki wolnych podręczników.
/*
 *	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;
}
//------------------------------------------------------------------------