#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int n;
int started = 0;

void * thread_func(void * arg)
{
	int last;

	pthread_mutex_lock(&mutex);
	started++;
	last = started == n;
	while (started < n) 
		pthread_cond_wait(&cond, &mutex);
	if (last) {
		printf("last started\n");
		pthread_cond_broadcast(&cond);
	}
	pthread_mutex_unlock(&mutex);

	return NULL;
}

int main(int argc, char *argv[])
{
	pthread_t * threads;
	int i;

	if (argc < 2)
		return 0;

	n = atoi(argv[1]);
	threads = (pthread_t *)malloc(n*sizeof(pthread_t));
	assert(threads);

	for (i=0; i<n; i++)
		assert(! pthread_create(threads+i, NULL, thread_func, NULL));

	for (i=0; i<n; i++)
		assert(! pthread_join(threads[i], NULL));
	
	printf("exit\n");
	return 0;
}
