day05-進程通信

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

代碼:

#include<myhead.h>int num=520;//臨界資源//1.創建互斥鎖
pthread_mutex_t fastmutex;//定義任務函數
void *task1(void *arg){printf("1111111\n");//3.臨界區上面獲取鎖資源(上鎖)pthread_mutex_lock(&fastmutex);num=1314;sleep(3);printf("task1:num = %d\n",num); //1314//4. 釋放鎖資源pthread_mutex_unlock(&fastmutex);
}void *task2(void *arg){printf("2222222\n");pthread_mutex_lock(&fastmutex);num++;      //521sleep(1);   //休眠時任務1執行到賦值語句printf("task2:num = %d\n",num);pthread_mutex_unlock(&fastmutex);
}int main(int argc, char const *argv[])
{//2.初始化互斥鎖pthread_mutex_init(&fastmutex,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;}printf("tid1:%#lx, tid2:%#lx\n",tid1,tid2);//回收資源if(pthread_join(tid1,NULL)==0)printf("tid1回收成功\n");if(pthread_join(tid2,NULL)==0)printf("tid2回收成功\n");//5. 銷毀鎖資源pthread_mutex_destroy(&fastmutex);return 0;
}

結果:

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

代碼:

#include<myhead.h>//創建無名信號了
sem_t sem;//定義生產者線程
void *task1(void *arg){printf("1111111\n");int num= 5;while(num--){//3.申請資源//    sem_wait(&sem);sleep(1);printf("我生產了一輛車\n");//4.釋放資源sem_post(&sem);}pthread_exit(NULL);
}//定義消費者線程
void *task2(void *arg){printf("2222222\n");int num= 5;while(num--){//3.申請資源sem_wait(&sem);printf("我消費了一輛車\n");//4.釋放資源//    sem_post(&sem);}pthread_exit(NULL);
}int main(int argc, char const *argv[])
{//初始化無名信號量sem_init(&sem,0,0);//第一個0:表示用于線程的同步//第二個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;}printf("tid1:%#lx, tid2:%#lx\n",tid1,tid2);//回收資源if(pthread_join(tid1,NULL)==0)printf("tid1回收成功\n");if(pthread_join(tid2,NULL)==0)printf("tid2回收成功\n");//釋放無名信號量sem_destroy(&sem);return 0;
}

結果:

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

代碼:

#include<myhead.h>//1. 定義條件變量
pthread_cond_t cond;//11. 創建互斥鎖
pthread_mutex_t fastmutex;//定義生產者線程
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(&fastmutex);//4. 進入等待隊列pthread_cond_wait(&cond,&fastmutex);printf("%#lx:消費了一輛車\n",pthread_self());//54. 釋放鎖資源pthread_mutex_unlock(&fastmutex);pthread_exit(NULL);
}int main(int argc, char const *argv[])
{//2. 初始化無名信號量pthread_cond_init(&cond,NULL);//22. 初始化互斥鎖pthread_mutex_init(&fastmutex,NULL);//創建2個線程,分別是生產者和消費者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\ntid4:%#lx, tid5:%#lx, tid6:%#lx\n",tid1,tid2,tid3,tid4,tid5,tid6);//回收資源if(pthread_join(tid1,NULL)==0)printf("tid1回收成功\n");if(pthread_join(tid2,NULL)==0)printf("tid2回收成功\n");if(pthread_join(tid3,NULL)==0)printf("tid3回收成功\n");if(pthread_join(tid4,NULL)==0)printf("tid4回收成功\n");if(pthread_join(tid5,NULL)==0)printf("tid5回收成功\n");if(pthread_join(tid6,NULL)==0)printf("tid6回收成功\n");//5. 銷毀條件變量pthread_cond_destroy(&cond);//55. 銷毀鎖資源pthread_mutex_destroy(&fastmutex);return 0;
}

結果:

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

代碼:

#include<myhead.h>int main(int argc, char const *argv[])
{//創建管道文件,并返回該管道文件的文件描述符(最小位分配原則)int pipefd[2]={0};if(pipe(pipefd)==1)PRINT_ERR("");printf("pipedf[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){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);     //退出進程}elsePRINT_ERR("");    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, char const *argv[])
{//打開管道文件int wfd=1;//以只寫的形式打開文件if((wfd=open("./myfifo",O_WRONLY))==-1)PRINT_ERR("");//定義容器char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));   //清空數組內容fgets(wbuf,sizeof(wbuf),stdin);     //從終端輸入數據wbuf[strlen(wbuf)-1]=0;//將數據寫入管道文件中write(wfd,wbuf,strlen(wbuf));//對寫入的數據進行判斷if(strcmp(wbuf,"quit")==0)break;}return 0;
}
#include<myhead.h>int main(int argc, char const *argv[])
{//打開管道文件int wfd=1;//以只讀的形式打開文件if((wfd=open("./myfifo",O_RDONLY))==-1)PRINT_ERR("");//定義容器char rbuf[128]="";while(1){//清空rbuf內容bzero(rbuf,sizeof(rbuf));//將數據寫入管道文件中read(wfd,rbuf,sizeof(rbuf));//輸出rbuf的數據printf("父進程傳來的數據為:%s\n",rbuf);//對讀取的數據進行判斷if(strcmp(rbuf,"quit")==0)break;}return 0;
}

結果:

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

代碼:

管道文件創建

#include<myhead.h>int main(int argc, const char *argv[])
{//創建一個管道文件if(mkfifo("./myfifo1", 0664) == -1){perror("mkfifo1 error");return -1;}if(mkfifo("./myfifo2", 0664) == -1){perror("mkfifo2 error");return -1;}getchar();       //阻塞system("rm myfifo1");system("rm myfifo2");return 0;
}

線程:

#include<myhead.h>int main(int argc, char const *argv[])
{//創建一個子進程pid_t pid=fork();if(pid>0){//父進程//打開管道文件int wfd = -1;//以只寫的形式打開文件if((wfd = open("./myfifo1", O_WRONLY)) == -1){perror("open error");return -1;}//定義容器char wbuf[128] = "";while(1){printf("這里是1號機,請輸入>>>");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//將數據寫入有名管道write(wfd, wbuf, strlen(wbuf));//判斷結果if(strcmp(wbuf,"quit") == 0)break;}//關閉文件close(wfd);          
//        wait(NULL);  //阻塞回收子進程資源}else if(pid==0){//子進程//打開管道文件int rfd = -1;//以只寫讀的形式打開文件if((rfd = open("./myfifo2", O_RDONLY)) == -1){perror("open error");return -1;}//定義容器char rbuf[128] = "";while(1){//清空數組bzero(rbuf, sizeof(rbuf));//讀取管道中的數據read(rfd, rbuf, sizeof(rbuf));//輸出結果printf("\t\t\t\t\t1號機收到的數據為:%s\n", rbuf);//判斷結果if(strcmp(rbuf,"quit") == 0)break;}//關閉文件close(rfd);exit(EXIT_SUCCESS);     //退出進程}elsePRINT_ERR("");    return 0;
}
#include<myhead.h>int main(int argc, char const *argv[])
{//創建一個子進程pid_t pid=fork();if(pid>0){//父進程//打開管道文件int rfd = -1;//以只寫讀的形式打開文件if((rfd = open("./myfifo1", O_RDONLY)) == -1){perror("open error");return -1;}//定義容器char rbuf[128] = "";while(1){//清空數組bzero(rbuf, sizeof(rbuf));//讀取管道中的數據read(rfd, rbuf, sizeof(rbuf));//輸出結果printf("\t\t\t\t\t2號機收到的數據為:%s\n", rbuf);//判斷結果if(strcmp(rbuf,"quit") == 0)break;}//關閉文件close(rfd); //       wait(NULL);//   wait(NULL);  //阻塞回收子進程資源}else if(pid==0){//子進程//打開管道文件int wfd = -1;//以只寫的形式打開文件if((wfd = open("./myfifo2", O_WRONLY)) == -1){perror("open error");return -1;}//定義容器char wbuf[128] = "";while(1){printf("這里是2號機,請輸入>>>");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//將數據寫入管道write(wfd, wbuf, strlen(wbuf));//判斷結果if(strcmp(wbuf,"quit") == 0)break;}//關閉文件close(wfd);      exit(EXIT_SUCCESS);     //退出進程}elsePRINT_ERR("");    return 0;
}

結果:

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

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

相關文章

LeetCode每日刷題:101. 對稱二叉樹

題目&#xff1a; 解題思路&#xff1a;可以新寫一個函數&#xff0c;從root開始&#xff0c;root的left的頭結點將記為lefttree&#xff08;左子樹&#xff09;,root的lright的頭結點將記為righttree&#xff08;右子樹&#xff09;&#xff0c; 然后遞歸左子樹的root.left與右…

【鴻蒙 HarmonyOS 4.0】TypeScript開發語言

一、背景 HarmonyOS 應用的主要開發語言是 ArkTS&#xff0c;它由 TypeScript&#xff08;簡稱TS&#xff09;擴展而來&#xff0c;在繼承TypeScript語法的基礎上進行了一系列優化&#xff0c;使開發者能夠以更簡潔、更自然的方式開發應用。值得注意的是&#xff0c;TypeScrip…

Python:Keyboard Interrupt - 當代碼遇到“Ctrl+C“時發生了什么?

Python&#xff1a;Keyboard Interrupt - 當代碼遇到"CtrlC"時發生了什么&#xff1f; &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;【Matplotlib之旅&#xff1a;零基礎精通數據可視化】 &#x1f4a1; 創作高質量博文&#x…

Web服務器集群: kylin 部署 Halo博客系統

目錄 一、實驗 1.環境 2. kylin 部署mysql數據庫 3. kylin 構建Java運行環境 4. 創建博客使用的數據庫 5. kylin 部署 halo博客系統 6. kylin 部署nginx 7. kylin 使用 SSL證書基于https訪問部署的博客系統 二、問題 1.mysql安裝報錯 2.查看mysql數據庫報錯 3.syste…

【k近鄰】 K-Nearest Neighbors算法k值的選擇

【k近鄰】 K-Nearest Neighbors算法原理及流程 【k近鄰】 K-Nearest Neighbors算法距離度量選擇與數據維度歸一化 【k近鄰】 K-Nearest Neighbors算法k值的選擇 【k近鄰】 Kd樹的構造與最近鄰搜索算法 【k近鄰】 Kd樹構造與最近鄰搜索示例 k近鄰算法&#xff08;K-Nearest Neig…

jdk動態代理與CGLib動態代理

jdk動態代理 目標對象 package com.study;/*** 目標對象&#xff08;被代理的對象&#xff09;**/ public class Target implements TargetInf{public String name;public Target() {}public Target(String name) {this.name name;}public String buyCola (String name){Sys…

【SQL注入】靶場SQLI DUMB SERIES-24通過二次注入重置用戶密碼

先使用已知信息admin/admin登錄進去查下題&#xff0c;發現可以修改密碼 猜測可能存在的SQL語句&#xff1a;UPDATE user SET password新密碼 WHERE user用戶名 and password舊密碼 假設我們知道有個admin用戶&#xff0c;但是不知道其密碼&#xff0c;如何可以將其密碼重置&…

雜題——1097: 蛇行矩陣

題目描述 蛇形矩陣是由1開始的自然數依次排列成的一個矩陣上三角形。 輸入格式 本題有多組數據&#xff0c;每組數據由一個正整數N組成。&#xff08;N不大于100&#xff09; 輸出格式 對于每一組數據&#xff0c;輸出一個N行的蛇形矩陣。兩組輸出之間不要額外的空行。矩陣三角…

如何在群輝7.2中使用Docker搭建容器魔方服務并遠程訪問【內網穿透】

文章目錄 1. 拉取容器魔方鏡像2. 運行容器魔方3. 本地訪問容器魔方4. 群輝安裝Cpolar5. 配置容器魔方遠程地址6. 遠程訪問測試7. 固定公網地址 本文主要介紹如何在群輝7.2版本中使用Docker安裝容器魔方&#xff0c;并結合Cpolar內網穿透工具實現遠程訪問本地網心云容器魔方界面…

shell中字符串的操作,和shell中數組的操作

獲取長度 rootubuntu:/home/test/Desktop# a"hello world" rootubuntu:/home/test/Desktop# echo ${#a} 11字符串切片 ${parameter:offset} 偏移量 $(parameter:offset:length} 偏移量&#xff1a;長度rootubuntu:/home/test/Desktop# echo ${a:1:2} el截取最后一個…

C#知識點-17(正則表達式)

正則表達式 概念&#xff1a;正則表達式是用來進行文本處理的技術&#xff0c;是語言無關的&#xff0c;在幾乎所有語言中都有實現 元字符&#xff1a; 1、.&#xff1a;匹配除\n之外的任何單個字符。例如正則表達式“b.g”能匹配如下字符串&#xff1a;“big”、“bug”、“…

MySQL 窗口函數溫故知新

本文用于復習數據庫窗口函數&#xff0c;希望能夠溫故知新&#xff0c;也希望讀到這篇文章的有所收獲。 本文以&#xff1a;MySQL為例 參考文檔&#xff1a; https://www.begtut.com/mysql/mysql-window-functions.html 使用的樣例數據&#xff1a;https://www.begtut.com/m…

對象池模式-Object Pool Pattern

原文地址:https://jaune162.blog/design-pattern/object-pool-pattern/ 原文中可下載高清SVG矢量類圖 引言 對象池模式(Object Pool Pattern)是一種創建一組可重用對象的設計模式。它通過維護一個預分配的對象集合,避免了頻繁地創建和銷毀對象所帶來的性能開銷。在需要使用…

力扣_字符串11—實現前綴樹(字典樹、Trie樹)

題目 方法 對于每一個節點&#xff0c;初始化一個長度為26的數組&#xff0c;用來存儲對應字母子節點的地址對于每一個節點&#xff0c;初始化一個 b o o l bool bool 變量用來表示是否為葉子節點 代碼 class Trie { private:vector<Trie*> children vector<Trie…

LeetCode //C - 901. Online Stock Span

901. Online Stock Span Design an algorithm that collects daily price quotes for some stock and returns the span of that stock’s price for the current day. The span of the stock’s price in one day is the maximum number of consecutive days (starting from…

ESP8266智能家居(1)——開發環境的搭建

1.前期介紹 本次打算使用esp8266的開發板——NodeMCU&#xff0c;進行物聯網相關項目的學習。開發環境使用Arduino軟件。 NodeMCU實物圖為&#xff1a; 開發環境截圖為&#xff1a; 2.軟件下載 我使用的arduino版本為1.8.5&#xff0c;其安裝包如下&#xff1a; 【免費】ar…

vue3 #跨組件通信

//爺爺組件中 import { provide , ref } from vue const money ref (100) //定義數據 provide( money , money ) //提供數據給孫子組件 const changeMoney ( m:number ) > { //定義函數 if (money) { money.value money.value - m } } provide(&quo…

Python系列(19)—— 條件語句

一、條件語句的基本概念 條件語句&#xff0c;也稱為選擇語句&#xff0c;允許程序根據條件的結果來執行不同的代碼塊。Python中最常用的條件語句是if語句&#xff0c;其基本語法如下&#xff1a; if condition:# 當條件為真時執行的代碼塊如果條件為真&#xff08;即非零或非…

學習總結22

解題思路 簡單模擬。 代碼 #include <bits/stdc.h> using namespace std; long long g[2000000]; long long n; int main() {long long x,y,z,sum0,k0;scanf("%lld",&n);for(x1;x<n;x)scanf("%lld",&g[x]);for(x1;x<n;x){scanf(&qu…

GEE必須會教程—時間都去哪了(Date參數類型)

時間和空間是世界存在的兩種基本屬性&#xff0c;大部分的數據都有特有的通道存儲時間信息&#xff0c;用戶需要通過獲取數據存儲的信息&#xff0c;來判斷數據的可用性&#xff0c;以及數據在時間上發生的變化。在遙感上&#xff0c;空間數據集合中&#xff0c;時間信息顯得更…