1
私はAS TANENBAUMのModern Operation Systemsという本を読んでおり、以下のように条件変数を説明する例を示します。私にはデッドロックがあり、私が見逃していることが分かりません。mutexのデッドロック、条件変数コード?
消費者スレッドが最初に開始します。 の直後にthe_mutexがロックされています。コンシューマ条件変数の待機中にスレッドがブロックされました。condc。
プロデューサーは、この時点で実行されている場合消費者がそれを解放したことがないので、the_mutexはまだ、ロックされます。したがってプロデューサもブロックされます。
これは教科書のデッドロックの問題です。私はここで何かを逃しましたか? THX
#include <stdio.h>
#include <pthread.h>
#define MAX 10000000000 /* Numbers to produce */
pthread_mutex_t the_mutex;
pthread_cond_t condc, condp;
int buffer = 0;
void* consumer(void *ptr) {
int i;
for (i = 1; i <= MAX; i++) {
pthread_mutex_lock(&the_mutex); /* lock mutex */
/*thread is blocked waiting for condc */
while (buffer == 0) pthread_cond_wait(&condc, &the_mutex);
buffer = 0;
pthread_cond_signal(&condp);
pthread_mutex_unlock(&the_mutex);
}
pthread_exit(0);
}
void* producer(void *ptr) {
int i;
for (i = 1; i <= MAX; i++) {
pthread_mutex_lock(&the_mutex); /* Lock mutex */
while (buffer != 0) pthread_cond_wait(&condp, &the_mutex);
buffer = i;
pthread_cond_signal(&condc);
pthread_mutex_unlock(&the_mutex);
}
pthread_exit(0);
}
int main(int argc, char **argv) {
pthread_t pro, con;
//Simplified main function, ignores init and destroy for simplicity
// Create the threads
pthread_create(&con, NULL, consumer, NULL);
pthread_create(&pro, NULL, producer, NULL);
}