ch4-spin-condvar
Chapter_4 job-queue3 | condvar |
spin-condvar.c ALP, p. 83-84
#include <stdio.h> // for printf(), putchar(), fflush(), stdout, NULL
#include <unistd.h> // for sleep()
#include <pthread.h> // for pthread_t, pthread_create(), pthread_mutex_t,
// pthread_mutex_init(), pthread_mutex_lock(), pthread_mutex_unlock()
int thread_flag;
pthread_mutex_t thread_flag_mutex;
void initialize_flag(void);
void* thread_function (void* thread_arg);
void set_thread_flag (int flag_value);
int main()
{
int i, flag = 1;
initialize_flag();
set_thread_flag(flag);
pthread_t thread;
pthread_create (&thread, NULL, &thread_function, NULL);
for(i = 0; ; i++) // for ever
{
printf("main ");
fflush(stdout); // flush the output buffer
sleep(1); // pause for 1 second
if (i % 5 == 4) // every 5 seconds
{
putchar('\n');
flag = (flag + 1) % 2; // change state, 0 <--> 1
set_thread_flag(flag);
}
}
return 0;
}
void initialize_flag(void)
{
pthread_mutex_init (&thread_flag_mutex, NULL);
thread_flag = 0;
}
void do_work(void);
/* Calls do_work() repeatedly while the thread flag is set,
otherwise spins */
void* thread_function (void* thread_arg)
{
while(1) // for ever
{
int flag_is_set;
/* Protect the flag with a mutex lock: */
pthread_mutex_lock (&thread_flag_mutex);
flag_is_set = thread_flag;
pthread_mutex_unlock (&thread_flag_mutex);
if (flag_is_set)
{do_work ();}
/* else do nothing, just loop again */
}
return NULL;
}
void do_work(void)
{
printf("work ");
fflush(stdout); // flush the output buffer
sleep(1); // pause for 1 second
}
/* Sets the value of the thread flag to FLAG_VALUE. */
void set_thread_flag (int flag_value)
{
/* Protect the flag with a mutex lock: */
pthread_mutex_lock (&thread_flag_mutex);
thread_flag = flag_value;
pthread_mutex_unlock (&thread_flag_mutex);
}
/*
gcc spin-condvar.c -o spin-condvar -lpthread
./spin-condvar
main work main work main work main work main work
main work main main main main
main work main work main work main work main work
main main main main main
main work main work main work main work main work
main main main main main
main work main work main work main work main work
main main main main main
main work main work main work main work main work
main main main main main
main work main work main work main work main work
main work main main main main
main work main work main work main work work main work
main main ^C // Ctrl^C
*/
Chapter_4 job-queue3 | BACK_TO_TOP | condvar |
Comments
Post a Comment