Syncronizing Threads


Problem

int foo = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void foo_ready()
{
    pthread_mutex_lock(&mutex);
    while (foo != 1) {
        pthread_mutex_unlock(&mutex);
        sleep(1);
        pthread_mutex_lock(&mutex);
   }
   pthread_mutex_unlock(&mutex);
}

void foo_initializer()
{
    pthread_mutex_lock(&mutex);
    if (foo == 0)
        foo = 1;	/* This must only be done once. */
    pthread_mutex_unlock(&mutex);
}
The thread needs to wait until the state of a shared variable changes, but either the thread spends too much time checking or isn't responsive enough.


Condition Variable


Creating and Destroying Condition Variables

int pthread_cond_init(pthread_cond_t * cond, pthread_condattr_t *attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_destroy(pthread_cond_t * cond);


Waiting on a Condition Variable

int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex)

int pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex,
     const struct timespec *abstime)


Waking threads on a Condition Variable

int pthread_cond_signal(pthread_mutex_t * cond)

int pthread_cond_broadcast(pthread_mutex_t * cond)


Fixed Example

int foo = 0;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void foo_ready()
{
    pthread_mutex_lock(&mutex);
    while (foo != 1) {
        pthread_cond_wait(&cond, &mutex);
    }
    pthread_mutex_unlock(&mutex);
}

void foo_initializer()
{
    pthread_mutex_lock(&mutex);
    if (foo == 0)
        foo = 1;	/* This must only be done once. */
    pthread_cond_broadcast(&cond);
    pthread_mutex_unlock(&mutex);
}


[TOP] [BACK] [FORWARD]


Prepared by Chris Provenzano (proven@mit.edu)