/***************************************************
*--------------------------------------------------
* 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 3
#define WAIT_TIME_SECONDS 15
static void checkResults(char *string, int rc) {
if (rc) {
printf("Error on : %s, rc=%d", string, rc);
exit(EXIT_FAILURE);
}
return;
}
int workToDo = 0;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *threadfunc(void *parm)
{
int rc;
struct timespec ts;
struct timeval tp;
rc = pthread_mutex_lock(&mutex);
checkResults("pthread_mutex_lock()n", rc);
/* Usually worker threads will loop on these operations */
while (1) {
rc = gettimeofday(&tp, NULL);
checkResults("gettimeofday()n", rc);
/* Convert from timeval to timespec */
ts.tv_sec = tp.tv_sec;
ts.tv_nsec = tp.tv_usec * 1000;
ts.tv_sec += WAIT_TIME_SECONDS;
while (!workToDo) {
printf("Thread blockedn");
rc = pthread_cond_timedwait(&cond, &mutex, &ts);
/* If the wait timed out, in this example, the work is complete, and */
/* the thread will end. */
/* In reality, a timeout must be accompanied by some sort of checking */
/* to see if the work is REALLY all complete. In the simple example */
/* we'll just go belly up when we time out. */
if (rc == ETIMEDOUT) {
printf("Wait timed out!n");
rc = pthread_mutex_unlock(&mutex);
checkResults("pthread_mutex_lock()n", rc);
pthread_exit(NULL);
}
checkResults("pthread_cond_timedwait()n", rc);
}
printf("Thread consumes work heren");
workToDo = 0;
}
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);
}
rc = pthread_mutex_lock(&mutex);
checkResults("pthread_mutex_lock()n", rc);
printf("One work item to give to a threadn");
workToDo = 1;
rc = pthread_cond_signal(&cond);
checkResults("pthread_cond_signal()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;
} |
|