1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
The code in the producer threads is the same as before, except that we add a call to
pthread_cond_signal():
s = pthread_mutex_lock(&mtx);
if (s != 0)
errExitEN(s, "pthread_mutex_lock");
avail++; /* Let consumer know another unit is available */
s = pthread_mutex_unlock(&mtx);
if (s != 0)
errExitEN(s, "pthread_mutex_unlock");
s = pthread_cond_signal(&cond); /* Wake sleeping consumer */
if (s != 0)
errExitEN(s, "pthread_cond_signal");
Before considering the code of the consumer, we need to explain pthread_cond_wait() in greater detail. We noted earlier that a condition variable always has an associated mutex. Both of these objects are passed as arguments to pthread_cond_wait(), which performs the following steps:
* unlock the mutex specified by mutex;
* block the calling thread until another thread signals the condition variable cond; and
* relock mutex.
The pthread_cond_wait() function is designed to perform these steps because, normally, we access a shared variable in the following manner:
s = pthread_mutex_lock(&mtx); if (s != 0)
errExitEN(s, "pthread_mutex_lock");
while (/* Check that shared variable is not in state we want */)
pthread_cond_wait(&cond, &mtx);
/* Now shared variable is in desired state; do some work */
s = pthread_mutex_unlock(&mtx); if (s != 0)
errExitEN(s, "pthread_mutex_unlock"); |
Partager