mirror of
https://github.com/clearlinux/graphene.git
synced 2026-09-06 13:51:28 +00:00
70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
|
|
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
|
|
|
|
void * function1();
|
|
void * function2();
|
|
int count = 0;
|
|
|
|
#define COUNT_DONE 10
|
|
#define COUNT_HALT1 3
|
|
#define COUNT_HALT2 6
|
|
|
|
int main (int argc, const char ** argv)
|
|
{
|
|
pthread_t thread1, thread2;
|
|
|
|
pthread_create(&thread1, NULL, &function1, NULL);
|
|
pthread_create(&thread2, NULL, &function2, NULL);
|
|
|
|
pthread_join(thread1, NULL);
|
|
pthread_join(thread2, NULL);
|
|
|
|
printf("Final count: %d\n", count);
|
|
return 0;
|
|
}
|
|
|
|
void * function1 (void)
|
|
{
|
|
for(;;) {
|
|
// Lock mutex and then wait for signal to relase mutex
|
|
pthread_mutex_lock(&count_mutex);
|
|
|
|
// Wait while functionCount2() operates on count
|
|
// mutex unlocked if condition varialbe in functionCount2() signaled.
|
|
pthread_cond_wait(&condvar, &count_mutex);
|
|
count++;
|
|
printf("Counter value in function1: %d\n", count);
|
|
|
|
pthread_mutex_unlock(&count_mutex);
|
|
|
|
if (count >= COUNT_DONE)
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void * function2 (void)
|
|
{
|
|
for(;;) {
|
|
pthread_mutex_lock(&count_mutex);
|
|
|
|
if (count < COUNT_HALT1 || count > COUNT_HALT2) {
|
|
// Condition of if statement has been met.
|
|
// Signal to free waiting thread by freeing the mutex.
|
|
// Note: functionCount1() is now permitted to modify "count".
|
|
pthread_cond_signal(&condvar);
|
|
} else {
|
|
count++;
|
|
printf("Counter value function2: %d\n", count);
|
|
}
|
|
|
|
pthread_mutex_unlock(&count_mutex);
|
|
|
|
if (count >= COUNT_DONE)
|
|
return NULL;
|
|
}
|
|
}
|