C言語におけるスリーピングバーバー問題の解析と実装方法


  1. ミューテックスと条件変数を使用する方法: この方法では、ミューテックスと条件変数を使用してスレッドの同期を行います。以下に簡単なコード例を示します。

    #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;
    }
  2. キューを使用する方法: この方法では、キューを使用して待ち行列を管理します。以下に簡単なコード例を示します。

    #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;
    }