POSIX Threads/Przykładowe programy/Program 9

/*
 *	Przykładowy program dla kursu "POSIX Threads" z wikibooks.pl
 *
 *	Temat: zmienne warunkowe
 *
 *	Autor: Wojciech Muła
 *	Ostatnia zmiana: 2010-03-xx
 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>	// sleep

pthread_mutex_t	mutex	= PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t	cond	= PTHREAD_COND_INITIALIZER;

char warunek = 0;

void* watek(void* numer) {
	printf("\turuchomiono wątek #%d\n", (int)numer);
	while (1) {
		pthread_mutex_lock(&mutex);
		do {
			if (warunek)
				break;
			else {
				printf("\twątek #%d oczekuje na sygnał...\n", (int)numer);
				pthread_cond_wait(&cond, &mutex);
				printf("\t... wątek #%d otrzymał sygnał!\n", (int)numer);
			}
		} while (1);
		pthread_mutex_unlock(&mutex);
		/* ... */
	}

	return NULL;
}

#define N 5	/* liczba wątków */

int main() {
	pthread_t id[N];
	int i;

	puts("początek programu");

	/* utworzenie wątków */
	for (i=0; i < N; i++) {
		errno = pthread_create(&id[i], NULL, watek, (void*)(i+1));
		if (errno) {
			perror("pthread_create");
			return EXIT_FAILURE;
		}
	}

	/* wysyłanie sygnałów */

	sleep(1);
	puts("pthread_cond_signal - sygnalizacja");
	pthread_cond_signal(&cond);

	sleep(1);
	puts("pthread_cond_broadcast - rozgłaszanie");
	pthread_cond_broadcast(&cond);

	sleep(1);

	/* kończymy proces, bez oglądania się na wątki */
	puts("koniec programu");
	return EXIT_SUCCESS;
}