-
ミューテックスと条件変数を使用する方法: この方法では、ミューテックスと条件変数を使用してスレッドの同期を行います。以下に簡単なコード例を示します。
#include <stdio.h> #include <pthread.h> #define MAX_CUSTOMERS 10 pthread_mutex_t mutex; pthread_cond_t cond; int waiting_customers = 0; void *barber_thread(void *arg) { while (1) { pthread_mutex_lock(&mutex); while (waiting_customers == 0) { pthread_cond_wait(&cond, &mutex); } waiting_customers--; pthread_mutex_unlock(&mutex); // バーバーが客を切る処理 pthread_mutex_lock(&mutex); // バーバーが客を切り終えた処理 pthread_mutex_unlock(&mutex); } } void *customer_thread(void *arg) { pthread_mutex_lock(&mutex); if (waiting_customers < MAX_CUSTOMERS) { waiting_customers++; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); // バーバーが客を待つ処理 } else { pthread_mutex_unlock(&mutex); // 待合室が満席の場合の処理 } } int main() { // 初期化処理 // バーバースレッドの作成 // 複数の顧客スレッドの作成 // スレッドの終了処理 return 0; }
-
キューを使用する方法: この方法では、キューを使用して待ち行列を管理します。以下に簡単なコード例を示します。
#include <stdio.h> #include <pthread.h> #define MAX_CUSTOMERS 10 pthread_mutex_t mutex; pthread_cond_t cond; int waiting_customers = 0; void *barber_thread(void *arg) { while (1) { pthread_mutex_lock(&mutex); while (waiting_customers == 0) { pthread_cond_wait(&cond, &mutex); } waiting_customers--; pthread_mutex_unlock(&mutex); // バーバーが客を切る処理 pthread_mutex_lock(&mutex); // バーバーが客を切り終えた処理 pthread_mutex_unlock(&mutex); } } void *customer_thread(void *arg) { pthread_mutex_lock(&mutex); if (waiting_customers < MAX_CUSTOMERS) { waiting_customers++; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); // バーバーが客を待つ処理 } else { pthread_mutex_unlock(&mutex); // 待合室が満席になった場合の処理 } } int main() { // 初期化処理 // バーバースレッドの作成 // 複数の顧客スレッドの作成 // スレッドの終了処理 return 0; }