IPC----哲学家就餐问题(并发与互斥)
哲學(xué)家就餐問題描述:
5個(gè)哲學(xué)家,5個(gè)筷子。5個(gè)哲學(xué)家圍坐在一張桌子上,筷子放在分別放在每個(gè)哲學(xué)家的兩旁。如果所有哲學(xué)家在某個(gè)時(shí)刻同時(shí)拿起左邊的筷子,那么右邊的筷子就都被其他的哲學(xué)家拿了,造成大家都無法吃飯。但是大家都不想放下左邊的筷子(規(guī)則是先拿起左邊筷子在拿起右邊的,吃完飯?jiān)诜畔聝蓚€(gè)筷子),這就是死鎖。
解決這個(gè)問題有個(gè)辦法是
在拿起筷子前先判斷左右兩個(gè)筷子是否可用,可用才能拿,而且是同時(shí)拿,這樣不相鄰的哲學(xué)家就可以吃上飯,不會造成死鎖。
實(shí)現(xiàn)代碼如下
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
}; //用于設(shè)置信號量所需要的聯(lián)合體
int semid;
int sem_del(int semid) //刪除一個(gè)信號量集
{
int ret;
ret=semctl(semid,0,IPC_RMID,0); //不知道信號量集合中有幾個(gè)信號量,故對第2個(gè)參數(shù)設(shè)為0
if (ret==-1)
printf("semdel falied
");
return 0;
}
void wait_for_2fork(int no)
{
int left =no; //左刀叉
int right = (no+1)%5; //右刀叉
struct sembuf buf[2] ={{left,-1,0},{right,-1,0}}; //-1表示為P操作
semop(semid,buf,2); //等待獲取刀叉(資源)
}
void free_2fork(int no)
{
int left =no; //左刀叉
int right = (no+1)%5; //右刀叉
struct sembuf buf[2] ={{left,1,0},{right,1,0}}; //-1表示為P操作
semop(semid,buf,2); //釋放獲取的刀叉(資源)
}
void phliosophere(int no)
{
srand(getpid()); //以進(jìn)程號作為隨機(jī)數(shù)的種子
while(1)
{
printf("philosophere %d is thinking
",no);
sleep(rand()%5+1);
printf("philosophere %d is hungry
",no);
//sleep(rand()%5+1);
wait_for_2fork(no); //等待獲取刀叉
printf("philosophere %d is eating
",no);
sleep(rand()%5+1);
free_2fork(no); //釋放刀叉
}
}
int main()
{
//int semid;
semid=semget(IPC_PRIVATE,5,IPC_CREAT|0666); //創(chuàng)建5個(gè)私有信號量,每一個(gè)信號量相當(dāng)于一把叉子
if(semid==-1)
{
printf("semget failed
");
return 0;
}
union semun su;
su.val=1;
int i;
for(i=0;i<5;i++)
semctl(semid,i,SETVAL,su); //初始化信號量
int no=0; //進(jìn)程id
pid_t pid;
for(i=0;i<5;i++)
{
pid=fork();
if(pid==-1)
{
printf("fork failed
");
return 0;
}
if(pid==0) //子進(jìn)程
{
no=i;
break;
}
}
phliosophere(no); //哲學(xué)家行為實(shí)現(xiàn)
return 0;
}
新問題描述:
設(shè)有5個(gè)哲學(xué)家,共享一張放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人兩邊各放一只,哲學(xué)家們在肚子饑餓時(shí)才試圖分兩次從兩邊拿起筷子就餐。
條件:
1)拿到兩只筷子時(shí)哲學(xué)家才開始吃飯。
2)如果筷子已在他人手上,則該哲學(xué)家必須等他人吃完之后才能拿到筷子。
3)任一哲學(xué)家在自己未拿到兩只筷子前卻不放下自己手中的筷子。
試:
1)描述一 個(gè)保證不會出現(xiàn)兩個(gè)鄰座同時(shí)要求吃飯的通信算法。
2)描述一個(gè)即沒有兩個(gè)鄰座同時(shí)吃飯,有沒有餓死(永遠(yuǎn)拿不到筷子)的算法
見參考2
參考:
用信號量解決哲學(xué)家就餐問題 http://www.oschina.net/code/snippet_724028_36857
操作系統(tǒng)并發(fā)和互斥:哲學(xué)家進(jìn)餐問題 http://blog.sina.com.cn/s/blog_759803690101d9ne.html
哲學(xué)家就餐問題linux下c++代碼 http://blog.sina.com.cn/s/blog_704553390100uq75.html
總結(jié)
以上是生活随笔為你收集整理的IPC----哲学家就餐问题(并发与互斥)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 055驱逐舰的武器都有哪些?
- 下一篇: 魂斗罗归来坦克有几种炮弹呢?