日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

IPC----哲学家就餐问题(并发与互斥)

發布時間:2024/8/26 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 IPC----哲学家就餐问题(并发与互斥) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

哲學家就餐問題描述:

  5個哲學家,5個筷子。5個哲學家圍坐在一張桌子上,筷子放在分別放在每個哲學家的兩旁。如果所有哲學家在某個時刻同時拿起左邊的筷子,那么右邊的筷子就都被其他的哲學家拿了,造成大家都無法吃飯。但是大家都不想放下左邊的筷子(規則是先拿起左邊筷子在拿起右邊的,吃完飯在放下兩個筷子),這就是死鎖。

解決這個問題有個辦法是

  在拿起筷子前先判斷左右兩個筷子是否可用,可用才能拿,而且是同時拿,這樣不相鄰的哲學家就可以吃上飯,不會造成死鎖。

實現代碼如下

#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) */
           };            //用于設置信號量所需要的聯合體


 int semid;
 
 int sem_del(int semid)  //刪除一個信號量集
 {
	int ret;
	ret=semctl(semid,0,IPC_RMID,0);  //不知道信號量集合中有幾個信號量,故對第2個參數設為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());      //以進程號作為隨機數的種子
	 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);  //創建5個私有信號量,每一個信號量相當于一把叉子
	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;    //進程id
	pid_t pid;
	for(i=0;i<5;i++)
	{
		pid=fork();
		if(pid==-1)
		{
			printf("fork failed
");
			return 0;
		}
		if(pid==0)   //子進程
		{
			no=i;
			break;
		}
	}
	
	phliosophere(no);         //哲學家行為實現

	return 0;
 }

  

新問題描述:

 設有5個哲學家,共享一張放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人兩邊各放一只,哲學家們在肚子饑餓時才試圖分兩次從兩邊拿起筷子就餐。
條件:
1)拿到兩只筷子時哲學家才開始吃飯。
2)如果筷子已在他人手上,則該哲學家必須等他人吃完之后才能拿到筷子。
3)任一哲學家在自己未拿到兩只筷子前卻不放下自己手中的筷子。
試:
1)描述一 個保證不會出現兩個鄰座同時要求吃飯的通信算法。
2)描述一個即沒有兩個鄰座同時吃飯,有沒有餓死(永遠拿不到筷子)的算法

見參考2

參考:

用信號量解決哲學家就餐問題 http://www.oschina.net/code/snippet_724028_36857

操作系統并發和互斥:哲學家進餐問題 http://blog.sina.com.cn/s/blog_759803690101d9ne.html

哲學家就餐問題linux下c++代碼 http://blog.sina.com.cn/s/blog_704553390100uq75.html

總結

以上是生活随笔為你收集整理的IPC----哲学家就餐问题(并发与互斥)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。