2024.02.22作业

1. 将互斥机制的代码实现重新敲一遍

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128int num = 520;
pthread_mutex_t mutex;void* task1(void* arg)
{printf("111111111111111\n");pthread_mutex_lock(&mutex);num = 1314;sleep(3);printf("task1:num = %d\n", num);pthread_mutex_unlock(&mutex);
}void* task2(void* arg)
{printf("222222222222222\n");pthread_mutex_lock(&mutex);num++;sleep(1);printf("task2:num = %d\n", num);pthread_mutex_unlock(&mutex);
}int main(int argc, char const *argv[])
{pthread_mutex_init(&mutex, NULL);pthread_t thread1, thread2;if (pthread_create(&thread1, NULL, task1, NULL) != 0 || \pthread_create(&thread2, NULL, task2, NULL) != 0){perror("thread create error");return -1;}printf("thread1:%#lx, thread2:%#lx\n", thread1, thread2);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_destroy(&mutex);return 0;
}

2. 将无名信号量的代码实现重新敲一遍

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 1024sem_t sem1;
sem_t sem2;
sem_t sem3;void* task1(void* arg)
{int num = 5;while (num--){sem_wait(&sem1);printf("A");sem_post(&sem2);}pthread_exit(NULL);
}void* task2(void* arg)
{int num = 5;while (num--){sem_wait(&sem2);printf("B");sem_post(&sem3);}pthread_exit(NULL);
}void* task3(void* arg)
{int num = 5;while (num--){sem_wait(&sem3);printf("C\n");sem_post(&sem1);}pthread_exit(NULL);
}int main(int argc, char const *argv[])
{sem_init(&sem1, 0, 1);sem_init(&sem2, 0, 0);sem_init(&sem3, 0, 0);pthread_t thread1, thread2, thread3;if (pthread_create(&thread1, NULL, task1, NULL) != 0 || \pthread_create(&thread2, NULL, task2, NULL) != 0 || \pthread_create(&thread3, NULL, task3, NULL) != 0){puts("thread create error");return -1;}pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_join(thread3, NULL);sem_destroy(&sem1);sem_destroy(&sem2);sem_destroy(&sem3);return 0;
}

3. 将条件变量的代码实现重新敲一遍

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128pthread_cond_t cond;
pthread_mutex_t mutex;void* task1(void* arg)
{int num = 5;while (num--){sleep(1);printf("%#lx:生产一辆车\n", pthread_self());}pthread_cond_broadcast(&cond);pthread_exit(NULL);
}void* task2(void* arg)
{pthread_mutex_lock(&mutex);pthread_cond_wait(&cond, &mutex);printf("%#lx:获得一辆车\n", pthread_self());pthread_mutex_unlock(&mutex);
}int main(int argc, char const *argv[])
{pthread_mutex_init(&mutex, NULL);pthread_t thread1, thread2, thread3, thread4, thread5, thread6;if (pthread_create(&thread1, NULL, task1, NULL) != 0 || \pthread_create(&thread2, NULL, task2, NULL) != 0 || \pthread_create(&thread3, NULL, task2, NULL) != 0 || \pthread_create(&thread4, NULL, task2, NULL) != 0 || \pthread_create(&thread5, NULL, task2, NULL) != 0 || \pthread_create(&thread6, NULL, task2, NULL) != 0){perror("thread create error");return -1;}printf("thread1:%#lx, thread2:%#lx, thread3:%#lx, thread4:%#lx, thread5:%#lx, thread6:%#lx\n", thread1, thread2, thread3, thread4, thread5, thread6);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_join(thread3, NULL);pthread_join(thread4, NULL);pthread_join(thread5, NULL);pthread_join(thread6, NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}

4. 将无名管道的代码实现重新敲一遍

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 1024int main(int argc, char const *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){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){bzero(rbuf, sizeof(rbuf));read(pipefd[0], rbuf, sizeof(rbuf));printf("父进程传入的字符串是:%s\n", rbuf);if (strcmp(rbuf, "quit") == 0){break;}}close(pipefd[0]);exit(EXIT_SUCCESS);}return 0;
}

5. 将有名管道的代码实现重新敲一遍

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128void menu()
{printf("请选择:\n");printf("1.创建管道\n");printf("2.输入\n");printf("3.输出\n");printf("4.删除管道\n");printf("选择:");
}int init_fifo(char* filename)
{if (mkfifo(filename, 0664) == -1){return -1;}return 0;
}void* send(void* arg)
{char* filename = (char*)arg;int wfd = -1;if ((wfd = open(filename, O_WRONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char wbuf[MAXSIZE] = "";while (1){printf("输入>>>");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);
}void* receive(void* arg)
{int rfd = -1;if ((rfd = open("./myfifo", O_RDONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char rbuf[MAXSIZE] = "";while (1){bzero(rbuf, sizeof(rbuf));read(rfd, rbuf, sizeof(rbuf));printf("收到的数据为:%s\n", rbuf);if (strcmp(rbuf, "quit") == 0){break;}}close(rfd);exit(EXIT_SUCCESS);
}int main(int argc, char const *argv[])
{int n;menu();scanf("%d", &n);getchar();char filename[] = "./myfifo";if (n == 1){if (init_fifo(filename) == 0){puts("创建成功!");}else{puts("创建失败!");}return 0;}if (n == 4){char cmd[MAXSIZE];snprintf(cmd, sizeof(cmd), "rm %s", filename);system(cmd);return 0;}pthread_t thread = -1;if (n == 2){if (pthread_create(&thread, NULL, send, filename) != 0){perror("create thread error");return -1;}}if (n == 3){if (pthread_create(&thread, NULL, receive, filename) != 0){perror("create thread error");return -1;}}pthread_join(thread, NULL);return 0;
}

6. 使用有名管道完成两个进程的相互通信(可使用多进程或多线程)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128void menu()
{printf("请选择:\n");printf("1.创建管道\n");printf("2.输入输出\n");printf("3.输出输入\n");printf("4.删除管道\n");printf("选择:");
}int init_fifo(char* filename)
{if (mkfifo(filename, 0664) == -1){return -1;}return 0;
}void* send(void* arg)
{char* filename = (char*)arg;int wfd = -1;if ((wfd = open(filename, O_WRONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char wbuf[MAXSIZE] = "";while (1){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);
}void* receive(void* arg)
{char* filename = (char*)arg;int rfd = -1;if ((rfd = open(filename, O_RDONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char rbuf[MAXSIZE] = "";while (1){bzero(rbuf, sizeof(rbuf));read(rfd, rbuf, sizeof(rbuf));printf("收到的数据为:%s\n", rbuf);if (strcmp(rbuf, "quit") == 0){break;}}close(rfd);exit(EXIT_SUCCESS);
}int main(int argc, char const *argv[])
{int n;menu();scanf("%d", &n);getchar();char f1[] = "./myfifo0";char f2[] = "./myfifo1";if (n == 1){if (init_fifo(f1) == 0 && init_fifo(f2) == 0){puts("创建成功!");}else{puts("创建失败!");}return 0;}if (n == 4){char cmd[MAXSIZE];snprintf(cmd, sizeof(cmd), "rm %s %s", f1, f2);system(cmd);return 0;}pthread_t thread1 = -1;pthread_t thread2 = -1;if (n == 2){if (pthread_create(&thread1, NULL, send, f1) != 0){perror("create thread error");return -1;}if (pthread_create(&thread2, NULL, receive, f2) != 0){perror("create thread error");return -1;}}if (n == 3){if (pthread_create(&thread1, NULL, send, f2) != 0){perror("create thread error");return -1;}if (pthread_create(&thread2, NULL, receive, f1) != 0){perror("create thread error");return -1;}}pthread_join(thread1, NULL);pthread_join(thread2, NULL);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/261985.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DC与DCT DCG的区别

先进工艺不再wire load model进行静态时序分析&#xff0c;否则综合结果与后端物理电路差距很大&#xff0c;因此DC综合工具也进行了多次迭代&#xff0c;DC工具有两种模式&#xff0c;包括wire load mode和Topographical Mode&#xff0c;也就是对应的DC Expert和DC Ultra。 …

Linux课程三课---Linux开发环境的使用(yum的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Python-pdfplumber读取PDF内容

文章目录 前言一、pdfplumber模块1.1 pdfplumber的特点1.2 pdfplumber.PDF类1.3pdfplumber.Page类 二 pdfplumber的使用2.1 加载PDF2.2 pdfplumber.PDF 类2.3 pdfplumber.Page 类2.4 读取PDF2.5 读取PDF文档信息2.6 查看总页数2.7 查看总页数读取第一页的宽度&#xff0c;页高等…

B端系统:工作台页面,如何从平庸走向出众

Hi&#xff0c;大家好&#xff0c;我是贝格前端工场&#xff0c;从事8年前端开发的老司机。大家看过很多平庸的工作台页面&#xff0c;但是仔细分析过平庸的表现吗&#xff0c;仔细思考过如何实现出众的效果吗&#xff1f;这篇文章为你解读。 一、工作台页面是什么&#xff0c;…

【前端素材】推荐优质后台管理系统Xoric平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 功能层次 a. 用户管理功能&#xff1a; 用户注册和登录&#xff1a;管理用户账户的注册和登录过程。权限管…

【前端】前端三要素之DOM

写在前面&#xff1a;本文仅包含DOM内容&#xff0c;JavaScript传送门在这里&#xff0c;BOM传送门在这里。 本文内容是假期中刷的黑马Pink老师视频&#xff08;十分感谢Pink老师&#xff09;&#xff0c;原文保存在个人的GitLab中&#xff0c;如果需要写的网页内容信息等可以评…

OpenCV人脸检测案例实战

人脸检测是一种计算机视觉技术&#xff0c;旨在识别图像或视频中的人脸。这项技术的基本内容包括使用特定的算法和模型来定位和识别人脸&#xff0c;通常涉及在图像中寻找面部特征&#xff0c;如眼睛、鼻子、嘴巴等&#xff0c;以便准确地确定人脸的位置和边界。人脸检测技术的…

MySQL 窗口函数温故知新

本文用于复习数据库窗口函数&#xff0c;希望能够温故知新&#xff0c;也希望读到这篇文章的有所收获。 本文以&#xff1a;MySQL为例 参考文档&#xff1a; https://www.begtut.com/mysql/mysql-window-functions.html 使用的样例数据&#xff1a;https://www.begtut.com/m…

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项&#xff1a;props 是只读的 2.组件事件-组件传递数据2.1.温馨提示&#xff1a;组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…

学习鸿蒙一定要搞清楚的几个概念

目录 1、UI框架 2、应用模型 2.1、应用模型介绍 2.2、两种应用模型 2.3、应用模型和UI框架的关系 3、Ability 3.1、Ability介绍 3.2、FA模型的ability 3.3、Stage模型的Ability 1、UI框架 HarmonyOS提供了一套UI(User Interface,用户界面)开发框架&#xff0c;即方舟…

java 课程签到管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 课程签到管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…

OpenGauss数据库本地搭建并结合内网穿透实现远程访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

专业140+总分420+南京信息工程大学811信号与系统考研经验南信大电子信息与通信工程,真题,大纲,参考书

今年顺利被南信大电子信息录取&#xff0c;初试420&#xff0c;专业811信号与系统140&#xff08;Jenny老师辅导班上140很多&#xff0c;真是大佬云集&#xff09;&#xff0c;今年应该是南信大电子信息最卷的一年&#xff0c;复试线比往年提高了很多&#xff0c;录取平均分380…

来分析两道小题

一、源码 二、分析 首先它会接两个参数一个是id一个是ps&#xff0c;传递的话会包含一个flag.php&#xff0c;然后数据库连接&#xff0c;之后传递过滤&#xff0c;然后查询&#xff0c;如果查到了就会取id&#xff0c;取出来看是不是跟adog一样&#xff0c;如果是它告诉你账号…

会声会影2024新功能及剪辑视频步骤教程

会声会影2024的新功能主要包括&#xff1a; 全新的标题动态与特效&#xff1a;用户可以为文字标题指定进入、中场和退出的不同动态效果&#xff0c;比如闪现进入、中场弹跳和淡出退出等&#xff0c;让文字标题更具动感。此外&#xff0c;还新增了多个标题特效&#xff0c;包括…

软考-中级-系统集成2023年综合知识(一)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 软考中级专栏回顾 专栏…

由面试题“Redis是否为单线程”引发的思考

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【大数据】Flink 之部署篇

Flink 之部署篇 1.概述和参考架构2.可重复的资源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式&#xff08;已废弃&#xff09;3.3 Session 模式 Flink 是一个多用途框架&#xff0c;支持多种不同的混合部署方案。下面&#xff0c;我们将简要介绍 Flink 集群的构建模块、…

爬虫基础(下)

requests模块可以用来获取网络数据&#xff1b; 那么对于爬虫来说&#xff0c;要获取下图网页中的内容&#xff0c;就需要网页的URL。 复制链接方法是&#xff0c;打开网页&#xff0c;点击链接框&#xff0c;右键选择复制。 requests.get()函数可用于模拟浏览器请求网页的过…

Flutter 3.19.0 版本新特性

其实在每个版本的更新中呢&#xff0c;都会合并很多很多的这个合并请求、还有开发建议&#xff0c;那么本版本的也不例外&#xff0c;社区官方发布的公告是合并了168个社区成员的1429个拉请求。 当然&#xff0c;如果你的时间允许的话&#xff0c;你可以去查看一下这些请求&am…