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.mzph.cn/news/696036.shtml

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

相关文章

世界顶级名校计算机专业学习使用教材汇总

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IauYk2cGjEyljid0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析

详情V&#xff1a;gjt0312765817632教授如何集成多源数据&#xff0c;依托ArcGIS Pro和R语言环境&#xff0c;采用“活力-组织力-恢复力-贡献力”&#xff08;VORS&#xff09;模型定量测算生态系统健康指数&#xff08;EHI&#xff09;&#xff1b;如何从经济城镇化&#xff0…

瑞_Redis_初识Redis(含安装教程)

文章目录 1 初识Redis1.1 认识NoSQL1.1.1 结构化与非结构化1.1.2 关联和非关联1.1.3 查询方式1.1.4 事务1.1.5 总结 1.2 认识Redis1.2.1 介绍1.2.2 特征1.2.3 优势 1.3 安装Redis ★★★1.3.1 Linux安装Redis1.3.1.1 安装Redis依赖 1.3.2 Windows安装Redis1.3.2.1 安装步骤1.3.…

ETL快速拉取物流信息

我国作为世界第一的物流大国&#xff0c;但是在目前的物流信息系统还存在着几大的痛点。主要包括以下几个方面&#xff1a; 数据孤岛&#xff1a;有些物流企业各个部门之间的数据标准不一致&#xff0c;难以实现数据共享和协同&#xff0c;容易导致信息孤岛。 操作繁琐&#x…

数据结构D3作业

1. 2. 按位插入 void insert_pos(seq_p L,datatype num,int pos) { if(LNULL) { printf("入参为空&#xff0c;请检查\n"); return; } if(seq_full(L)1) { printf("表已满&#xff0c;不能插入\n"); …

unity学习(34)——角色选取界面(跨场景坑多)

先把SelectMenu中的camera的audio listener去掉。 现在还是平面&#xff0c;直接在camera下面添加两个panel即可&#xff0c;应该是用不到canvas了&#xff0c;都是2D的UI。 加完以后问题来了&#xff0c;角色选择界面的按钮跑到主界面上边了&#xff0c;而且现在账号密码都输…

CoordConv(NeurIPS 2018)

paper&#xff1a;An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution official implementation&#xff1a;https://github.com/uber-research/coordconv 存在的问题 本文揭示并分析了CNN在两种不同类型空间表示之间转换能力的欠缺&#…

远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”

原因&#xff1a; vscode 版本是 1.86&#xff0c;服务器上的 glibc 和 libstdc 版本不满足 要求(2.28 和 3.4.25)。 解决&#xff1a; 1、下载 1.85.2&#xff0c;解压直接运行 Code.exe。 2、回退 Remote-ssh 到 0.107.1。 参考&#xff1a; vscode 1.86版本远程ssh不兼容旧…

Leetcode155(设计最小栈)

例题&#xff1a; 分析&#xff1a; 题目要求我们必须在常数时间内检索到最小元素。 我们可以使用两个栈&#xff08;A、B&#xff09;来实现&#xff0c;A栈用来正常存储数据、弹出数据&#xff0c; B栈用于存储A栈中的最小元素&#xff0c;如下图&#xff1a; 刚开始&#…

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有&#xff1a;1&#xff09;xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定&#xff1b;2&#xff09;Web请求参数绑定&#xff0c;在Spring MVC 中&#xff0c;Controller的方法参数通常会自…

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

开启智能互动新纪元——ChatGPT提示词工程的引领力

目录 提示词工程的引领力 高效利用ChatGPT提示词方法 提示词工程的引领力 近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT提示词工程正逐渐崭露头角&#xff0c;为智能互动注入了新的活力。这一技术的引入&#xff0c;使得人机交流更加流畅、贴近用户需求&…

2.22作业

test.c #include "test.h" seq_p creat_list(){seq_p L(seq_p)malloc(sizeof(seq_list));if(LNULL){printf("申请空间失败\n");return 0;}L->len0;return L; } int seq_p_empt(seq_p L){if(LNULL){return -12;}return L->len0?1:0; } int seq_p_fu…

华为OD机试真题-寻找最富裕的小家庭-2023年OD统一考试(C卷) --Python--开源

题目&#xff1a; 考察内容&#xff1a; dict–update—for sum max 代码&#xff1a; """ 题目分析&#xff1a;输入&#xff1a; N int 1,1000 成员总数 list len(list)N int 1, 1000000 财富值 N-1行&#xff0c; N1 N2, N1是N2的父节点 输出&#xff…

操作系统导论-课后作业-ch19

1. 本书在第6章中有过介绍&#xff0c;gettimeofday函数最多精确到us&#xff0c;并且大致精确&#xff08;并不完全精确&#xff09;&#xff0c;需要多迭代几次减少误差&#xff0c;循环次数太多也会导致结束时间小于开始时间&#xff08;即回滚&#xff09;的现象&#xff…

两数相加

2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个…

C语言—指针(1)

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

一文读懂:AWS 网络对等互连(VPC peering)实用操作指南

VPC peering connection-网络对等互连在您的 Atlas VPC 和云提供商的 VPC 之间建立私有连接。该连接将流量与公共网络隔离以提高安全性。本篇文章有VPC peering的操作指南以及价格等信息。如还有疑问请联系我们MongoDB的销售&#xff0c;客户成功经理或解决方案架构师。 1 使用…

2000-2022年各省环境规制数据(原始数据+计算过程+计算结果)

2000-2022年各省环境规制数据&#xff08;原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、范围&#xff1a;30省 3、来源&#xff1a;各省年鉴、国家统计局、统计年鉴 4、指标&#xff1a;年份、省份、工业污染源治理投资完成实际额、工业增加值…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…