Przejdź do zawartości

POSIX Threads/Przykładowe programy/Program 12

Z Wikibooks, biblioteki wolnych podręczników.
/*
 *	Przykładowy program dla kursu "POSIX Threads" z wikibooks.pl
 *
 *	Temat: zmiana rozmiaru stosu wątku
 *
 *	Autor: Wojciech Muła
 *	Ostatnia zmiana: 2010-03-xx
 */
#define _POSIX_C_SOURCE 200809L

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <limits.h>
#include <errno.h>

#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0)

#define N (100*1024)

/* wątek używa sporej tablicy alokowanej na stosie */
void* watek(void* arg) {
	char tablica[N];
	int i;
	for (i=0; i < N; i++)
		tablica[i] = 0;

	return NULL;
}
//------------------------------------------------------------------------

int main(int argc, char* argv[]) {
	pthread_t	id;
	pthread_attr_t	attr;
	size_t		rozmiar;

	errno = pthread_attr_init(&attr);
	if (errno) {
		perror("pthread_attr_init");
		return EXIT_FAILURE;
	}

	if (argc > 1) {
		rozmiar = atoi(argv[1]);
		printf("rozmiar stosu ustalony przez użytkownika: %u\n", rozmiar);
		printf("minimalny rozmiar stosu: %u\n", PTHREAD_STACK_MIN);

		errno = pthread_attr_setstacksize(&attr, rozmiar);
		test_errno("pthread_attr_setstacksize");
	}
	else {
		pthread_attr_getstacksize(&attr, &rozmiar);
		printf("domyślny rozmiar stosu: %u\n", rozmiar);
	}

	errno = pthread_create(&id, &attr, watek, NULL);
	test_errno("pthread_create");

	pthread_join(id, NULL);
	puts("wątek zakończony");

	pthread_attr_destroy(&attr);
}
//------------------------------------------------------------------------