進程線程的通信-day5

1、將互斥機制的代碼實現重新敲一遍。

#include<myhead.h>//臨界資源
int num=520;//1、創建一個互斥鎖變量
pthread_mutex_t mutex;void *task1(void *arg);
void *task2(void *arg);
int main(int argc, const char *argv[])
{//2、初始化互斥鎖pthread_mutex_init(&mutex,NULL);//定義線程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return 0;}//獲取tid號printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//回收線程資源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//5、摧毀鎖資源pthread_mutex_destroy(&mutex);return 0;
}
//任務1函數
void *task1(void *arg)
{//3、獲取鎖資源pthread_mutex_lock(&mutex);num = 1314;sleep(3);printf("task1:num=%d\n",num);//4、釋放鎖資源pthread_mutex_unlock(&mutex);
}
//任務2函數
void *task2(void *arg)
{//3、獲取鎖資源pthread_mutex_lock(&mutex);num ++;sleep(1);printf("task2:num=%d\n",num);//4、釋放鎖資源pthread_mutex_unlock(&mutex);
}


2、將無名信號量的代碼實現重新敲一遍。

#include<myhead.h>//1、創建無名信號量
sem_t sem;void *task1(void *arg);
void *task2(void *arg);
int main(int argc, const char *argv[])
{//2、初始化無名信號量sem_init(&sem,0,0);//定義線程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return 0;}//獲取tid號printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//回收線程資源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//5、釋放無名信號量sem_destroy(&sem);return 0;
}
//任務1函數
void *task1(void *arg)
{int num=5;while(num--){sleep(1);puts("我生產一輛特斯拉");//4、釋放資源sem_post(&sem);}pthread_exit(NULL);
}
//任務2函數
void *task2(void *arg)
{int num=5;while(num--){//3、申請資源sem_wait(&sem);puts("我買了一輛特斯拉");}pthread_exit(NULL);
}


3、將條件變量的代碼實現重新敲一遍。

#include<myhead.h>//1、定義條件變量
pthread_cond_t cond;//11、定義互斥鎖變量
pthread_mutex_t mutex;void *task1(void *arg);
void *task2(void *arg);
int main(int argc, const char *argv[])
{//2、初始化條件變量pthread_cond_init(&cond,NULL);//22、初始化互斥鎖pthread_mutex_init(&mutex,NULL);//定義線程pthread_t tid1,tid2,tid3,tid4,tid5,tid6;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return 0;}if(pthread_create(&tid3,NULL,task2,NULL)!=0){printf("tid3 create error\n");return 0;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){printf("tid4 create error\n");return 0;}if(pthread_create(&tid5,NULL,task2,NULL)!=0){printf("tid5 create error\n");return 0;}if(pthread_create(&tid6,NULL,task2,NULL)!=0){printf("tid6 create error\n");return 0;}printf("tid1:%#lx,tid2:%#lx,tid3:%#lx,tid4:%#lx,tid5:%#lx,tid6:%#lx\n",\tid1,tid2,tid3,tid4,tid5,tid6);//回收線程資源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_join(tid4,NULL);pthread_join(tid5,NULL);pthread_join(tid6,NULL);//5、摧毀條件變量pthread_cond_destroy(&cond);//55、摧毀互斥鎖pthread_mutex_destroy(&mutex);return 0;
}
//定義生產者函數
void *task1(void *arg)
{int num=5;while(num--){sleep(1);printf("%#lx:生產了一輛特斯拉\n",pthread_self());//3、喚醒一個消費者pthread_cond_signal(&cond);}pthread_exit(NULL);
}
//定義消費者函數
void *task2(void *arg)
{//33、上鎖pthread_mutex_lock(&mutex);//4、進入等待隊列pthread_cond_wait(&cond,&mutex);printf("%#lx:購買了一輛特斯拉\n",pthread_self());//4、解鎖pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}


4、將無名管道的代碼實現重新敲一遍。

#include<myhead.h>
//管道進程傳輸
int main(int argc, const char *argv[])
{//創建管道文件int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -1;}printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0]),pipefd[1];//創建子進程pid_t pid=fork();if(pid>0){//父進程//關閉管道讀端close(pipefd[0]);char wbuf[128]="";while(1){//清空wbuf數組bzero(wbuf,sizeof(wbuf));//終端輸入數據fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';//將數據寫入管道文件中write(pipefd[1],wbuf,strlen(wbuf));//輸入結束條件if(strcmp(wbuf,"quit")==0)break;}//關閉管道寫端close(pipefd[1]);//阻塞回收子進程資源wait(NULL);}else if(pid == 0){//子進程//關閉管道寫端close(pipefd[1]);char rbuf[128]="";while(1){//清空rbuf內容bzero(rbuf,sizeof(rbuf));//從管道文件中讀取數據read(pipefd[0],rbuf,sizeof(rbuf));//輸出rbuf的數據printf("父進程傳來的數據為:%s\n",rbuf);//讀取結束條件if(strcmp(rbuf,"quit")==0)break;}//關閉管道讀端close(pipefd[0]);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}


5、將有名管道的代碼實現重新敲一遍。

#include<myhead.h>
int main(int argc, const char *argv[])
{//創建一個管道文件if(mkfifo("./myfifo",0664)==-1){perror("mkfifo error");return -1;}//阻塞getchar();//清楚文件system("rm myfifo");return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{//打開管道文件int wfd=-1;//以只寫的形式打開文件if((wfd=open("./myfifo",O_WRONLY))==-1){perror("open error");return -1;}//定義容器char wbuf[128]="";while(1){printf("please enter>>>");fgets(wbuf,sizeof(wbuf),stdin);//把'\n'變為'\0'wbuf[strlen(wbuf)-1]='\0';//數據寫入管道write(wfd,wbuf,strlen(wbuf));//終端輸入結束條件if(strcmp(wbuf,"quit")==0)break;}//關閉文件close(wfd);return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{//打開管道文件int rfd=-1;//以只讀形式打開文件if((rfd = open("./myfifo",O_RDONLY))==-1){perror("open error");return -1;}//定義容器char rbuf[128]="";while(1){//清空rbuf數組bzero(rbuf,sizeof(rbuf));//讀取管道文件的數據read(rfd,rbuf,sizeof(rbuf));//輸出結果printf("收到的數據為:%s\n",rbuf);//讀取結束條件if(strcmp(rbuf,"quit")==0)break;}//關閉文件close(rfd);return 0;
}


6、使用有名管道完成兩個進程的相互通信(提示:可以使用多進程或多線程完成)。

//管道創建函數
#include<myhead.h>
int main(int argc, const char *argv[])
{//創建二個管道文件if(mkfifo("./text1",0664)==-1){perror("text1 error");return -1;}if(mkfifo("./text2",0664)==-1){perror("text2 error");return -1;}//阻塞getchar();//清楚文件system("rm text1");system("rm text2");return 0;
}
//用戶1發送和接受函數
#include<myhead.h>
int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//打開管道文件int wfd=-1;//以只寫的形式打開文件if((wfd=open("./text1",O_WRONLY))==-1){perror("open error");return -1;}//定義容器char wbuf[128]="";while(1){printf("please enter>>>");fgets(wbuf,sizeof(wbuf),stdin);//把'\n'變為'\0'wbuf[strlen(wbuf)-1]='\0';//數據寫入管道write(wfd,wbuf,strlen(wbuf));//終端輸入結束條件if(strcmp(wbuf,"quit")==0)break;}//關閉文件close(wfd);		//打開管道文件}else if(pid==0){//打開管道文件int rfd=-1;//以只讀形式打開文件if((rfd = open("./text2",O_RDONLY))==-1){perror("open error");return -1;}//定義容器char rbuf[128]="";while(1){//清空rbuf數組bzero(rbuf,sizeof(rbuf));//讀取管道文件的數據read(rfd,rbuf,sizeof(rbuf));//輸出結果printf("收到的數據為:%s\n",rbuf);//讀取結束條件if(strcmp(rbuf,"quit")==0)break;}//關閉文件close(rfd);}else {perror("fork error");return -1;}return 0;
}
//用戶2發送接受函數
#include<myhead.h>
int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//打開管道文件int rfd=-1;//以只讀形式打開文件if((rfd = open("./text1",O_RDONLY))==-1){perror("open error");return -1;}//定義容器char rbuf[128]="";while(1){//清空rbuf數組bzero(rbuf,sizeof(rbuf));//讀取管道文件的數據read(rfd,rbuf,sizeof(rbuf));//輸出結果printf("收到的數據為:%s\n",rbuf);//讀取管道文件的數據取結束條件if(strcmp(rbuf,"quit")==0)break;}//關閉文件close(rfd);}else if(pid==0){	//打開管道文件int wfd=-1;//以只寫的形式打開文件if((wfd=open("./text2",O_WRONLY))==-1){perror("open error");return -1;}//定義容器char wbuf[128]="";while(1){printf("please enter>>>");fgets(wbuf,sizeof(wbuf),stdin);//把'\n'變為'\0'wbuf[strlen(wbuf)-1]='\0';//數據寫入管道write(wfd,wbuf,strlen(wbuf));//終端輸入結束條件if(strcmp(wbuf,"quit")==0)break;}//關閉文件close(wfd);}else {perror("fork error");return -1;}return 0;
}

7、思維導圖

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

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

相關文章

Shiro-14-subject 主體

理解Apache Shiro中的主題 毫無疑問&#xff0c;Apache Shiro中最重要的概念是主題。 “主題”只是一個安全術語&#xff0c;它指的是應用程序用戶特定于安全的“視圖”。Shiro主題實例代表了單個應用程序用戶的安全狀態和操作。 這些操作包括: 身份驗證(登錄) 授權(訪問控…

了解JSON的作用及其方法

什么是json JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式采用完全獨立編程語言的文本格式存儲和表示數據&#xff08;就是字符串&#xff09;。它基于JavaScript語法&#xff0c;但可以被多種編程語言使用和解析。JSON以鍵值對的形式存…

高光譜圖像降噪方法(2D Wavelet, 3D Wavelet, FORPDN, HyRes等方法)

近年來&#xff0c;隨著遙感應用的不斷深入&#xff0c;高光譜圖像研究已經成為遙感領域發展最迅速的技術之一。與其他傳統成像技術相比&#xff0c;高光譜圖像具有更多優勢&#xff1a;更豐富的信息量、納米級的光譜分辨率以及范圍更廣且連續的光譜。因此&#xff0c;在農業、…

C#用反射實現兩個類的對象之間相同屬性的值的復制

目錄 1.適用于創建實體的時候從一個實體作為數據源賦值 2.適用于沒有創建實體&#xff0c;兩個實體之間數據的轉換 1.適用于創建實體的時候從一個實體作為數據源賦值 /// <summary> /// 反射實現兩個類的對象之間相同屬性的值的復制 /// 適用于初始化新實體 /// </…

選擇VR全景行業,需要了解哪些內容?

近年來&#xff0c;隨著虛擬現實、增強現實等技術的持續發展&#xff0c;VR全景消費市場得以穩步擴張。其次&#xff0c;元宇宙行業的高速發展&#xff0c;也在進一步拉動VR全景技術的持續進步&#xff0c;帶動VR產業的高質量發展。作為一種戰略性的新興產業&#xff0c;國家和…

OJ_學生信息系統

題干 輸入樣例&#xff1a; 5 zhaoyi 70 80 90 240 qianer 65 32 77 174 sunsan 100 55 68 223 lisi 86 77 90 253 wangwu 100 59 66 225 輸出樣例&#xff1a; *[qianer] 65 32 77 *[sunsan] 100 55 68 *[wangwu] 100 59 66 lisi 86 77 90 zhaoyi 70 80 90 wangwu 100 59 6…

k8s-權限管理

1. 身份認證 我們在目前的k8s集群環境里面&#xff0c;只能在master節點上執行kubectl的一些命令&#xff0c;在其他節點上執行就會報錯 # 看一下是不是 [rootnode1 ~]# kubectl get nodes E0220 12:50:15.695133 6091 memcache.go:238] couldnt get current server API gro…

云打印api搭建,云打印api怎么對接?

相信近來一段時間云打印概念的火熱讓很多企業和App都有開展打印業務的想法&#xff0c;但是云打印技術的開發又需要有打印設備的支持&#xff0c;這個時候我們可以找到專業的云打印服務平臺進行api對接。那么云打印api搭建&#xff0c;云打印api怎么對接&#xff1f;今天來一起…

es6 中字符串、函數、對象、數組分別新增了哪些擴展

es6 中字符串的擴展 includesstartsWithendsWith padStartpadEnd模版字符串 es6 中函數的擴展 箭頭函數 this 對象指向定義時所在的對象不可以當作構造函數&#xff0c;不可以使用 new 命令不可以使用 arguments 對象&#xff0c;可以使用 rest 參數不可以適用 yield 命令&a…

C語言自定義類型:結構體的使用及其內存對齊【超詳細建議點贊收藏】

目錄 1. 結構體類型的聲明1.1 結構的聲明1.2 結構體變量的創建和初始化1.3 結構的特殊聲明---匿名結構體1.4 結構的自引用 2.結構體內存對齊&#xff08;重點&#xff01;&#xff01;&#xff09;2.1 對齊規則2.2 例題講解2.3 為什么存在內存對齊&#xff1f;2.4 修改默認對齊…

OpenGauss數據庫本地搭建并結合內網穿透實現遠程訪問

文章目錄 前言1. Linux 安裝 openGauss2. Linux 安裝cpolar3. 創建openGauss主節點端口號公網地址4. 遠程連接openGauss5. 固定連接TCP公網地址6. 固定地址連接測試 前言 openGauss是一款開源關系型數據庫管理系統&#xff0c;采用木蘭寬松許可證v2發行。openGauss內核深度融合…

云渲染農場服務給力嗎?全天候不間斷服務如何保障?

近年來&#xff0c;云渲染農場以其強大的計算能力和高效的渲染速度而聞名&#xff0c;為各行各業的視覺創作提供了不可或缺的支持。但是&#xff0c;人們普遍關心的是&#xff0c;云渲染農場服務是否真的給力&#xff1f;全天候的服務又是如何保障呢&#xff1f; 實際上&#…

用Python插入頁碼到PDF文檔

頁碼是許多類型文件中的重要內容&#xff0c;它能方便讀者在文檔中的導航。在創建PDF文檔時&#xff0c;添加頁碼對于組織和引用內容特別有用。在本文中&#xff0c;我們將探討如何利用Python程序高效地插入頁碼到PDF文檔中&#xff0c;簡化工作流程并創建出精美、結構合理的PD…

【JavaEE】_synchronized關鍵字——監視器鎖monitor lock

目錄 1. synchronized的特性 2. synchronized的使用 3. Java標準庫中的線程安全類 1. synchronized的特性 &#xff08;1&#xff09;互斥&#xff1a; 前文已經介紹&#xff0c;某個線程執行到某個對象的synchronized中時&#xff0c;其他線程如果也執行到同一個對象&…

2024 Sora來了!“手機Agent智能體”也來了!

近日&#xff0c;Open AI發布了能夠根據文本生成超現實視頻的工具Sora&#xff0c;多款震撼視頻引爆科技圈刷屏&#xff0c;熱度持續發酵占據AI領域話題中心&#xff0c;被認為是AGI實現過程里的重大里程碑事件。新一輪的人工智能浪潮給人類未來的生產和生活方式帶來巨大而深遠…

VPN | 世界那么大,我想“魔法”上網看看,可以嗎?

Hi&#xff0c;大家好&#xff0c;我是半畝花海。世界那么大&#xff0c;我想“魔法”上網看看&#xff0c;可以嗎&#xff1f;隨著網絡的發展與普及&#xff0c;暢游網絡世界已成為人們生活的一部分。它給我們開拓了視野&#xff0c;增長了見聞&#xff0c;豐富了知識&#xf…

FISCO BCOS(二)———配置及使用控制臺

一、前言 FISCO BCOS是由金融區塊鏈合作聯盟&#xff08;深圳&#xff09;與微眾銀行共同發起的開源區塊鏈項目&#xff0c;支持多鏈多賬本&#xff0c;滿足金融行業復雜業務需求。本文將介紹如何在Ubuntu操作系統上使用Linux命令配置FISCO BCOS的控制臺并進行get/set操作。 目…

React 模態框的設計(一)拖動組件的設計

春節終結束了&#xff0c;忙得我頭疼。終于有時間弄自己的東西了。今天來寫一個關于拖動的實例講解。先看效果&#xff1a; 這是一個簡單的組件設計&#xff0c;如果用原生的js設計就很簡單&#xff0c;但在React中有些事件必須要多考慮一些。這是一個系列的文章&#xff0c;…

SpringBoot3整合elasticsearch8

版本 SpringBoot 3.0 Elasticsearch 8.12.1 依賴 我使用的 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 還可以用&#xff0c;但我沒用…

YOLOv9來咧!

文章目錄 論文:主要內容一、提出使用PGI&#xff08;Programmable Gradient Information&#xff0c;可編程梯度信息&#xff09;來解決信息瓶頸問題和深度監督機制不適合輕量級神經網絡的問題。二、設計了GELAN&#xff08;Generalized ELAN &#xff0c;廣義ELAN&#xff09;…