操作系統實驗四:多線程與信號量編程

操作系統實驗上機

更多技術請訪問:www.xuanworld.top

部分審核不通過的文章將發至個人博客:www.xuanworld.top

歡迎來52破解論壇閱讀帖子:https://www.52pojie.cn/thread-1891208-1-1.html

實驗名稱實驗序號實驗日期實驗人
多線程與信號量編程4公元2077年Rytter

一、實驗題目

20240525143602

二、相關原理和知識

  1. linux有關于信號量的相關函數,可以直接調用
  2. 利用pthread進行創建進程,每個進程都會有一個id
  3. 創建進程后每個進程都會對buffer進行互斥操作

三、實驗過程

  1. 編寫關于信號量與進程id的函數
  2. 編寫對buffer進行操作的兩個函數
  3. 編寫消費者與生產者的函數
  4. 編寫創建生產者與消費者的函數
  5. 放到Linux服務器上進行編譯和運行

四、實驗結果

20240525143717

五、問題總結

  1. 編譯時出現問題,原因位命令行沒有使用pthread
  2. 消費者的printf代碼位置不對,導致還沒消費就產生輸出

六、源碼

首先是buffer.h文件

typedef int buffer_item;
#define BUFFER_SIZE 5

之后是main.c文件

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#include "buffer.h"
buffer_item buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
sem_t  full,empty;
void buffer_out(){int i;for ( i = 0; i <BUFFER_SIZE ; ++i) {printf("%d",buffer[i]);}printf("\n");
}
int insert_item(int a,int b){sem_wait(&empty);pthread_mutex_lock(&mutex);int i;for(i = 0;i < BUFFER_SIZE;i++){if(buffer[i] == 0){buffer[i] = 1;//找到空的位置break;}}if(i == BUFFER_SIZE) return -1;printf("producer %d produced %d\n",a,b);buffer_out();pthread_mutex_unlock(&mutex);sem_post(&full);return 0;
}
int remove_item(int a,int b){sem_wait(&full);pthread_mutex_lock(&mutex);int i;for(i = 0;i < BUFFER_SIZE;i++){if(buffer[i] != 0){buffer[i] = 0;break;}}if(i == BUFFER_SIZE) return -1;printf("consumer %d consumed %d\n",a,b);//第幾個吃了幾個食物buffer_out();pthread_mutex_unlock(&mutex);sem_post(&empty);return 0;
}void * producer(void * param){int* num = (int*)param;int food_id=0;while(1){sleep(((rand() % 10) + 1));if(insert_item(*num,++food_id))printf("wrong\n");}
}void * consumer(void *param){int* num = (int*)param;int food_id=0;while(1){sleep(((rand() % 10) + 1));if(remove_item(*num,++food_id))printf("wrong\n");}
}int main(int argc,char *argv[])
{//1.獲取命令行輸入的數字if(argc != 4) return -1;int sleep_time = atoi(argv[1]);int producer_num = atoi(argv[2]);int consumer_num = atoi(argv[3]);//2.進行初始化pthread_mutex_init(&mutex,NULL);sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);int i;for(i=0;i<BUFFER_SIZE;i++) buffer[i]=0;//3.創建線程pthread_t producer_tid[producer_num];int producer_id[producer_num];for(i = 0;i < producer_num;i++){producer_id[i] = i + 1;pthread_create(&producer_tid[i],NULL,producer,&producer_id[i]);}pthread_t consumer_tid[consumer_num];int consumer_id[consumer_num];for(i = 0;i < consumer_num;i++){consumer_id[i] = i + 1;pthread_create(&consumer_tid[i],NULL,consumer,&consumer_id[i]);}//4.休眠sleep(sleep_time);//5.退出return 0;
}

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

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

相關文章

010-Linux磁盤介紹

文章目錄 1、名詞 2、類型 3、尺寸 4、接口/協議/總線 5、命名 6、分區方式 MBR分區 GPT分區 1、名詞 磁盤是計算機主要的存儲介質&#xff0c;可以存儲大量的二進制數據&#xff0c;并且斷電后也能保持數據不丟失。早期計算機使用的磁盤是軟磁盤&#xff08;Floppy D…

普通測試工程師與測試開發工程師:為何年薪存在15萬與30萬+的差距?

普通測試工程師想要轉型為測試開發工程師&#xff08;簡稱測開&#xff09;&#xff0c;需要學習一系列的知識和技能。以下是一些關鍵的學習領域&#xff1a; 編程能力&#xff1a;測試開發工程師需要具備一定的編程能力&#xff0c;能夠編寫自動化測試腳本和測試工具。因此&a…

基于yolov5和desnet的貓咪識別模型

前言 前段時間給學校的貓咪小程序搭建了識貓模型&#xff0c;可以通過貓咪的照片辨別出是那只貓貓&#xff0c;這里分享下具體的方案&#xff0c;先看效果圖&#xff1a; 源代碼在文末 模型訓練 在訓練服務器&#xff08;或你的個人PC&#xff09;上拉取本倉庫代碼。 圖片數…

[力扣題解] 200. 島嶼數量

題目&#xff1a;200. 島嶼數量 思路 深度優先搜索、廣度優先搜索、并查集&#xff1b; 代碼 廣度優先搜索 class Solution { public:int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};queue<pair<int, int>> que;void bfs(vector<vector<char>&g…

10款免費黑科技軟件,強烈推薦!

1.AI視頻生成——巨日祿 網頁版https://aitools.jurilu.com/ "巨日祿 "是一款功能強大的文本視頻生成器&#xff0c;可以快速將文本內容轉換成極具吸引力的視頻。操作簡單&#xff0c;用戶只需輸入文字&#xff0c;選擇喜歡的樣式和模板&#xff0c; “巨日祿”就會…

Day39貪心算法part06

LC738單調遞增的數字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出現strNum[i - 1] > strNum[i]的情況&#xff08;非單調遞增&#xff09;&#xff0c;首先想讓strNum[i - 1]–&#xff0c;然后strNum[i]給為9字符串是不可變的&#xff0c;不可以使用s.char…

嵌入式交叉編譯:OpenCV

編譯ffmpeg 嵌入式交叉編譯&#xff1a;ffmpeg及相關庫-CSDN博客 下載 LINUX編譯opencv_linux 編譯opencv 模塊-CSDN博客 解壓編譯 penCV自帶編譯配置&#xff0c;十分方便。 BUILD_DIR${HOME}/build_libsCROSS_NAMEaarch64-mix210-linuxFFMPEG_DIR${BUILD_DIR}/libmkdir…

樹莓派學習筆記——樹莓派的三種GPIO編碼方式

1、板載編碼&#xff08;Board pin numbering&#xff09;: 板載編碼是樹莓派上的一種GPIO引腳編號方式&#xff0c;它指的是按照引腳在樹莓派主板上的物理位置來編號。這種方式對于初學者來說可能比較直觀&#xff0c;因為它允許你直接根據引腳在板上的位置來編程。 2、BCM編…

Linux gurb2簡介

文章目錄 前言一、GRUB 2簡介二、GRUB 2相關文件/文件夾2.1 /etc/default/grub文件2.2 /etc/grub.d/文件夾2.3 /boot/grub/grub.cfg文件 三、grubx64.efi參考資料 前言 簡單來說&#xff0c;引導加載程序&#xff08;boot loader&#xff09;是計算機啟動時運行的第一個軟件程…

一起學習大模型 - 從底層了解Token Embeddings的原理(2)

文章目錄 前言4. Token Embeddings綜合運用演示4.1 Token Embeddings處理4.2 偽代碼示例4.3 計算cat和dog兩個詞的相近程序4.3.1 計算方法4.3.2 例子4.3.3 輸出結果 前言 上一篇文章了解了Token Embeddings的原理&#xff0c;這一篇&#xff0c;我們一起來綜合運用學到的知識來…

純干貨分享 機器學習7大方面,30個硬核數據集

在剛剛開始學習算法的時候&#xff0c;大家有沒有過這種感覺&#xff0c;最最重要的那必須是算法本身&#xff01; 其實在一定程度上忽略了數據的重要性。 而事實上一定是&#xff0c;質量高的數據集可能是最重要的&#xff01; 數據集在機器學習算法項目中具有非常關鍵的重…

文章解讀與仿真程序復現思路——電力系統保護與控制EI\CSCD\北大核心《計及溫控厭氧發酵和階梯碳交易的農村綜合能源低碳經濟調度》

本專欄欄目提供文章與程序復現思路&#xff0c;具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 電網論文源程序-CSDN博客電網論文源…

網絡域名是什么意思

網絡域名&#xff0c;顧名思義&#xff0c;就是網絡上的名字&#xff0c;類似于現實中的地址或姓名一樣&#xff0c;用來標識網絡上的一個或一組計算機或服務器的位置&#xff0c;以及它們的相應服務資源。網絡域名是互聯網上最基礎的基礎設施之一&#xff0c;是網絡通信的“標…

【mysql】更新操作是如何執行的

現有一張表&#xff0c;建表語句如下&#xff1a; mysql> create table T(ID int primary key, c int);如果要將 ID2 這一行的a字段值加 1&#xff0c;SQL語句會這么寫&#xff1a; mysql> update T set c c 1 where ID 2;上面這條sql執行時&#xff0c;分析器會通過詞…

Nacos 微服務管理

Nacos 本教程將為您提供Nacos的基本介紹&#xff0c;并帶您完成Nacos的安裝、服務注冊與發現、配置管理等功能。在這個過程中&#xff0c;您將學到如何使用Nacos進行微服務管理。下方是官方文檔&#xff1a; Nacos官方文檔 1. Nacos 簡介 Nacos&#xff08;Naming and Confi…

操作符詳解(上)(新手向)

操作符詳解&#xff08;上&#xff09; 一&#xff0c;算術操作符&#xff08;雙目操作符&#xff09;1:‘’,‘-’,‘*’2&#xff1a;‘/’&#xff0c;‘%’ 一&#xff0c;單目操作符1:‘’,‘-’2&#xff1a;‘!’3&#xff1a;‘&’4&#xff1a;‘*’5&#xff1a;…

linux 排查java內存溢出(持續更新中)

場景 tone.jar 啟動后內存溢出,假設pid 為48044 排查 1.確定java程序的pid(進程id) ps 或 jps 都可以 ps -ef | grep tone jps -l 2.查看堆棧信息 jmap -heap 48044 3.查看對象的實例數量顯示前30 jmap -histo:live 48044 | head -n 30 4.查看線程狀態 jstack 48044

Spring 事件監聽

參考&#xff1a;Spring事件監聽流程分析【源碼淺析】_private void processbean(final string beanname, fi-CSDN博客 一、簡介 Spring早期通過實現ApplicationListener接口定義監聽事件&#xff0c;Spring 4.2開始通過EventListener注解實現監聽事件 FunctionalInterface p…

Rustdesk客戶端源碼編譯

1.安裝VCPKG windows平臺vcpkg安裝-CSDN博客 2.使用VCPKG安裝: windows平臺vcpkg安裝-CSDN博客 配置VCPKG_ROOT環境變量: 安裝靜態庫: ./vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static 靜態庫安裝成…

【C語言深度解剖】(15):動態內存管理和柔性數組

&#x1f921;博客主頁&#xff1a;醉竺 &#x1f970;本文專欄&#xff1a;《C語言深度解剖》 &#x1f63b;歡迎關注&#xff1a;感謝大家的點贊評論關注&#xff0c;祝您學有所成&#xff01; ??&#x1f49c;&#x1f49b;想要學習更多C語言深度解剖點擊專欄鏈接查看&…