/***************************************************
*--------------------------------------------------
* Creat : 2001. 04. 10 (programed by Cori-Young )
* Site: http://www.byoneself.co.kr
* Update :
*--------------------------------------------------
* Compile : cc -o xxx xxx.c -lpthread -lrt
*--------------------------------------------------
* Machine hardware: sun4u
* OS version: 5.7
* Processor type: sparc
* Hardware: SUNW,Ultra-60
***************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#define _MULTI_THREADED
#define NTHREADS 5
static void checkResults(char *string, int rc) {
if (rc) {
printf("Error on : %s, rc=%d", string, rc);
exit(EXIT_FAILURE);
}
return;
}
int conditionMet = 0;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *threadfunc(void *parm)
{
int rc;
rc = pthread_mutex_lock(&mutex);
checkResults("pthread_mutex_lock()n", rc);
while (!conditionMet) {
printf("Thread blockedn");
rc = pthread_cond_wait(&cond, &mutex);
checkResults("pthread_cond_wait()n", rc);
}
rc = pthread_mutex_unlock(&mutex);
checkResults("pthread_mutex_lock()n", rc);
return NULL;
}
int main(int argc, char **argv)
{
int rc=0;
int i;
pthread_t threadid[NTHREADS];
printf("Enter Testcase - %sn", argv[0]);
printf("Create %d threadsn", NTHREADS);
for(i=0; i<NTHREADS; ++i) {
rc = pthread_create(&threadid[i], NULL, threadfunc, NULL);
checkResults("pthread_create()n", rc);
}
sleep(5); /* Sleep isn't a very robust way to serialize threads */
rc = pthread_mutex_lock(&mutex);
checkResults("pthread_mutex_lock()n", rc);
/* The condition has occured. Set the flag and wake up any waiters */
conditionMet = 1;
printf("Wake up all waiters...n");
rc = pthread_cond_broadcast(&cond);
checkResults("pthread_cond_broadcast()n", rc);
rc = pthread_mutex_unlock(&mutex);
checkResults("pthread_mutex_unlock()n", rc);
printf("Wait for threads and cleanupn");
for (i=0; i<NTHREADS; ++i) {
rc = pthread_join(threadid[i], NULL);
checkResults("pthread_join()n", rc);
}
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);
printf("Main completedn");
return 0;
} |
|