哲學家就餐問題C語言實現(涉及多執行緒 訊號量等)

2021-10-07 09:13:32 字數 2039 閱讀 2523

由dijkstra提出並解決的哲學家進餐問題(the dinning philosophers problem)是典型的同步問題。該問題是描述有五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐完畢,放下筷子繼續思考。

顯示出每個哲學家的工作狀態,如吃飯,思考。連續執行30次以上都未出現死鎖現象。

重要**展示:

(1)初始化int型陣列id[num]標識執行緒id號,用於後續傳參;初始化訊號量陣列sem_chopsticks[num]模擬五根筷子;初始化訊號量sem_eaters=4,用來控制同時可拿起筷子的最大人數。

int id[num]=;

sem_t sem_chopsticks[num]

;sem_t sem_eaters;

sem_init

(&sem_eaters,

0,num-

1)

(2)執行緒的例程處理函式,先等待訊號量sem_eaters,再等待訊號量sem_chopsticks[pthread_id],這兩個訊號量不為零說明此時同時拿起筷子的人數小於4,且該哲學家編號相同的筷子(記為左筷子)可以被拿起,所以拿起左子,然後等待右筷子sem_chopsticks[pthread_id+1]訊號量,拿到右筷子後便可以進餐,隨機釋放上述三個訊號量。

void

philosopher

(void

* ptid)

(3)迴圈建立5個執行緒模擬五位哲學家,執行緒例子程函式為philosopher,並傳入引數id[i]標識執行緒的id。

pthread_t philosopher_threads[num]

;sem_signal_init()

;for

( i=

0; i < num; i++

)

#include

#include

"pthread.h"

#include

"stdio.h"

#include

"stdlib.h"

#include

"semaphore.h"

#define num 5

int id[num]=;

sem_t sem_chopsticks[num]

;sem_t sem_eaters;

int eaters_num=0;

void

sem_signal_init()

}if(sem_init

(&sem_eaters,

0,num-1)

==-1)

}void

philosopher

(void

* ptid)

intmain()

}for

( j =

0; j < num; j++

)sem_destroy

(&sem_eaters)

;for

(k =

0; k < num ;

++k)

eaters_num =0;

// sleep(2);

}return0;

}

本程式用五個執行緒模擬五位哲學家,用五個sem_t型訊號量模擬五根筷子(臨界資源),解題的思想是:每次讓每位哲學家優先拿起自己左邊的筷子,並限制最多有四個人同時拿起筷子,從而避免了死鎖情況,該程式模擬五個哲學家進餐一次的情況,並重複模擬了1000次以上來檢驗是否出現死鎖情況,經檢驗程式執行正常,沒有出現死鎖狀況,上述僅展示了第1次和第1000次的情況。

哲學家就餐問題

本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...

哲學家就餐問題

pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...

哲學家就餐問題

假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。哲學家就餐問...