哲學家就餐(避免死鎖)(多進程版)

哲學家就餐(避免死鎖)(多進程版)

哲學家就餐利用信號量在多進程之間實現
下面展示一些代碼片段

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <semaphore.h>int main()
{pid_t pid;int i;sem_t *s;int left,right;int ret;int flag = 10;/*進程之間不能定義全局信號量,因為進程間全局變量是讀時共享,寫時復制,所以我們可以利用mmap函數建立映射區來實現多進程之間對信號量的操作。*/s = mmap(NULL,sizeof(sem_t)*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0);for(i = 0;i<5;i++){//初始化信號量sem_init(&s[i],1,1);}for(i=0;i<5;i++){//循環創建子進程pid = fork();if(pid == 0)break;else if(pid < 0){perror("fork:");exit(1);}}if(i<5){if(i == 4){left = 0; right = i;}else{left = i;right = i+1;}while(flag--){sem_wait(&s[left]);ret = sem_trywait(&s[right]);if(ret == 0){printf("%dth get sem,pid = %d\n",i,getpid());sleep(1);sem_post(&s[right]);printf("------%dth post right %d sem,pid = %d\n",i,right,getpid());sem_post(&s[left]);printf("------%dth post left  %d sem,pid = %d\n",i,left,getpid());sleep(1);}else{sem_post(&s[left]);printf("---------------%dth post left %d sem,pid = %d\n",i,left,getpid());sleep(1);}}}else/* 父進程  */{for(i = 0;i<5;i++){pid = waitpid(-1,NULL,0);//回收子進程if(pid != -1){printf("wait child %d,pid = %d\n",i,pid);}}for(i = 0;i<5;i++){//銷毀信號量ret = sem_destroy(&s[i]); if(ret == 0)printf("destroy sem success %d\n",i);}}return 0;
}

運行結果截圖:

可以看到程序運行時,進程交替獲得信號量。
哲學家輪流拿到左右兩個筷子(兩個信號量)然后進行就餐,用完就post釋放擁有的兩個筷子(兩個信號量),如果只獲得一個筷子(一個信號量),則放棄之前得到的一個筷子(信號量)。

【重點注意】:
直接將sem_t s[5]放在全局位置,試圖用于子進程間共享是錯誤的!應將其定義放置與mmap共享映射區中。

進程之間不能定義全局信號量,因為進程間全局變量是讀時共享,寫時復制,所以我們可以利用mmap函數建立映射區來實現多進程之間對信號量的操作。
使用方式:將s當成數組首地址看待,與使用數組s[5]沒有差異。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【匯編語言】數據類型的匹配問題:自動匹配與手動匹配

0 前言 本文基于8086匯編語言&#xff0c;不過x86系列語言具備向下兼容特點&#xff0c;大多數情況都可以用。 與高級語言數據類型的自動轉換和強制轉換一樣&#xff0c;匯編語言的數據類型也有 自動匹配和手動匹配。 下面&#xff0c;我來介紹一下匯編語言的相關原則。 1 …

生產者消費者模型(條件變量+互斥鎖)

生產者消費者模型 線程同步典型的案例即為生產者消費者模型&#xff0c;而借助條件變量來實現這一模型&#xff0c;是比較常見的一種方法。假定有兩個線程&#xff0c;一個模擬生產者行為&#xff0c;一個模擬消費者行為。兩個線程同時操作一個共享資源&#xff0c;生產者向其…

【匯編語言】王爽實驗8,分析一個奇怪的程序,學習筆記(20200517)

0 前言 先給出源程序 assume cs:code code segmentmov ax,4c00hint 21hstart:mov ax,0s:nopnopmov di,offset smov si,offset s2mov ax,cs:[si]mov cs:[di],axs0:jmp short ss1:mov ax,0int 21hmov ax,0s2:jmp short s1nopcode ends end start運行結果&#xff1a;本程序能夠…

Qt制作定時關機小程序

文章目錄 完成效果圖ui界面ui樣圖 main函數窗口文件頭文件cpp文件 引言 一般定時關機采用命令行模式&#xff0c;還需要我們計算在多久后關機&#xff0c;我們可以做一個小程序來定時關機 完成效果圖 ui界面 <?xml version"1.0" encoding"UTF-8"?>…

MIPS快速入門(原文+翻譯):MIPS Architecture and Assembly Language Overview(持續更新中)

前言 發布該文章的網站已經無法訪問&#xff0c;無法獲得相關翻譯授權&#xff0c;本人的翻譯僅供大家參考學習&#xff0c;盡可能使用直譯&#xff0c;并加上一些譯者注&#xff08;使用“ [1] ”的形式&#xff09;&#xff0c;以減少信息損失&#xff0c;水平有限&#xff…

Visual Studio 編譯優化選項:Debug與Release、禁止優化與O1、O2、Ox優化

Debug與禁止優化 Debug模式是調試模式&#xff0c;會有很多冗余的調試代碼&#xff0c;供開發者調試程序使用。 VS是默認使用Debug模式的&#xff0c;我使用的是VS 2017。 在Debug模式下&#xff0c;是默認開啟禁止優化的&#xff0c;我們來查看一下 在左側源文件的main.c處…

【匯編語言】記錄一組數中負數的個數,8086與MIPS匯編程序

題目及解答 統計由DATA開始的字節數據串中負元素的個數&#xff0c;數據個數在COUNT單元&#xff0c;統計結果存入RLT單元。 8086匯編&#xff1a; ; 統計數字中負數的個數【循環中加了個if else】 assume ds:datasg datasg segmentdata db 1,-2,-3,-1,-4,0,-2 count dw 7 ; 數…

【數字邏輯入門】計算機如何存儲1位二進制數

0 前言 本文將會以R-S鎖存器為例&#xff0c;引出鎖存器的核心和本質&#xff0c;之后再帶你構建更多類型的鎖存器&#xff0c;你能夠&#xff1a; 感受到由淺入深的學習方式體會到掌握核心本質的快感深刻理解核心套外殼的設計理念&#xff08;產品迭代1.0–>2.0–>3.0…

【算法訓練】DAY1:整數反轉

1 前言 題目來源于Leetcode。 重點&#xff1a;理清邏輯&#xff0c;忽略細節&#xff0c;模仿高手&#xff0c;五毒神掌 2 題目分析 題目很容易理解&#xff0c;先分成兩個部分 正數負數 先解決正數 最開始想到的是 intchar數組long唯一增加的就是&#xff0c;先判斷整…

【匯編語言】(x86)test與跳轉指令(je jle jge jg jl……)組合的含義

在x86指令集中&#xff0c;經常遇到test指令與條件跳轉指令組合&#xff0c;這是什么含義呢&#xff1f; 博主表示&#xff0c;查了很多資料也沒人完全說清楚…… 這里只用最簡單的&#xff0c;抽象層次進行說明&#xff0c;不講原理。 舉例 test edx,edx jle 某地址含義是&…

【藍橋杯】BASIC-8 回文數(2020-06-08)

題目 試題 基礎練習 回文數 資源限制 時間限制&#xff1a;1.0s 內存限制&#xff1a;512.0MB 問題描述   1221是一個非常特殊的數&#xff0c;它從左邊讀和從右邊讀是一樣的&#xff0c;編程求所有這樣的四位十進制數。    輸出格式   按從小到大的順序輸出滿足條件的…

【算法訓練】Leetcode 1295. 統計位數為偶數的數字(2020.06.09 )

1 題目 1295. 統計位數為偶數的數字 給你一個整數數組 nums&#xff0c;請你返回其中位數為 偶數 的數字的個數。 示例 1&#xff1a; 輸入&#xff1a;nums [12,345,2,6,7896] 輸出&#xff1a;2 解釋&#xff1a; 12 是 2 位數字&#xff08;位數為偶數&#xff09; 345 …

Vivado設置指定源文件進行RTL優化

像VS編譯器設置啟動項一樣&#xff0c;Vivado中&#xff0c;也有類似設計&#xff0c;可以看到&#xff0c;當前選中的是ALU&#xff0c;那么進行RTL優化的時候&#xff0c;會優化RTL的結果&#xff0c;而不是別的&#xff0c;如何改成別的&#xff1f; 在某文件上右鍵單擊選擇…

【完整流程】用VSCode替換Vivado默認編輯器

本文樓主找了很多資料&#xff0c;選出了最有用的資料&#xff0c;按照教程走&#xff0c;就可以順利搞定&#xff0c;先給出畫面 很酷很方便&#xff0c;同時還有 自動補全檢測錯誤列選自動生成仿真測試文件 等重要功能 Vivado原來的編輯器是這樣的…… 關鍵是&#xff0c…

IEDA中JavaDoc的自動生成、手動生成,以及生成html文檔

1 自動生成類的注釋 JavaDoc就是java特有的一種注釋。 1.1 配置 首先&#xff0c;IDEA點擊File-->Settings 然后Editor-->File and Code Templates-->Class 之后在這地方&#xff0c;添加一些代碼 /** * ${description} * * <p> * 創建日期&#xff1a;$…

【java】父類與子類的引用賦值關系

理清楚4個目標 父類引用&#xff08;“名”&#xff09;父類對象&#xff08;“實”&#xff09;子類引用子類對象 理清楚幾個操作 // 父類 public class parent{}// 子類 public class sun{}父類引用指向父類對象 parent p1 new parent();子類引用指向子類對象 son s1 …

IDEA自動生成 構造方法 get set方法

對于一個類&#xff0c;創建好成員變量后 右鍵單擊&#xff0c;選中Generate 然后 這幾個依次是 構造方法getsetget和set 我們可以選中一個&#xff0c;然后選中要生成的變量&#xff0c;點擊OK 這樣就可以自動生成 構成方法get方法set方法

IDEA快速修改類名和文件名

在你要修改的類名上&#xff0c;選中類名&#xff0c;然后 右鍵單擊選中Refactor選中Rename 也可以使用快捷鍵 Win用戶是Shift F6

java中 靜態方法與成員方法何時使用

靜態方法 不操作成員變量&#xff0c;可以直接調用 是用來直接對傳入的數據進行操作的 成員方法 需要操作對象的成員變量的 區別 靜態方法&#xff0c;不能操作成員變量&#xff0c;只是一個操作成員方法&#xff0c;可以操作成員變量&#xff0c;不僅僅是操作&#xff0…

通過編程解決問題的正確思路

1. 先知道我們面對一個怎樣的問題 2. 考慮這個問題在現實生活中&#xff0c;我們要用怎樣的方式去解決 3. 從現實到計算機&#xff0c;如何用編程的思路解決 4. 實現&#xff0c;編碼和測試 5. 迭代 現實問題自然語言解決方案機器語言解決方案編碼實現測試迭代