IO进程线程第七天(8.4)信号量,条件变量

在第一题的基础上加上一个需求:要求打印,倒置线程,顺序执行。出现的现象为先打印1234567,后打印7654321(不使用flag)

创建两个线程,其中一个线程读取文件中的数据,另外一个线程将读取到的内容打印到终端上,类似实现cat一个文件。

cat数据完毕后,要结束两个线程。

提示:先读数据,读到数据后将数据打印到终端上。

1.

#include<stdio.h>
#include<head.h>
char buf[]="1234567";
sem_t sem1,sem2;
void *myprintf(void *arg)
{int count=0;while(1){if(sem_wait(&sem1)<0)//p操作{ERR_MSG("sem_wait");return NULL;}printf("%s\n",buf);if(sem_post(&sem2)<0)//v操作{ERR_MSG("sem_post");return NULL;}}                                                                                                                                               pthread_exit(NULL);
}
void *strrev(void *arg)
{char t;while(1){if(sem_wait(&sem2)<0)//p操作{ERR_MSG("sem_wait");return NULL;}for(int i=0;i<strlen(buf)/2;i++){t=buf[i];buf[i]=buf[strlen(buf)-1-i];buf[strlen(buf)-1-i]=t;}if(sem_post(&sem1)<0)//v操作{ERR_MSG("sem_post");return NULL;}}pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{if(sem_init(&sem1,0,1)<0){ERR_MSG("sem_inti");return -1;}if(sem_init(&sem2,0,0)<0){ERR_MSG("sem_inti");return -1;}pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,myprintf,NULL)!=0){fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);return -1;}if(pthread_create(&tid2,NULL,strrev,NULL)!=0){fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);return -1;}pthread_join(tid2,NULL);sem_destroy(&sem1);sem_destroy(&sem2);return 0;
}

 2.

#include<stdio.h>
#include<head.h>
char c;
ssize_t res;
sem_t sem1,sem2;
void *myread(void *arg)
{int fp=open("ABC.c",O_RDONLY);if(fp<0){ERR_MSG("open");return NULL;}while(1){if(sem_wait(&sem1)<0){ERR_MSG("sem_wait");return NULL;}           res=read(fp,&c,1); if(0==res){if(sem_post(&sem2)<0){ERR_MSG("sem_post");return NULL;}break;}if(sem_post(&sem2)<0){ERR_MSG("sem_post");return NULL;}}
}
void *mywrite(void *arg)
{while(1){if(sem_wait(&sem2)<0){ERR_MSG("sem_wait");return NULL;}write(1,&c,res);if(0==res){if(sem_post(&sem1)<0){ERR_MSG("sem_post");return NULL;}break;}if(sem_post(&sem1)<0){ERR_MSG("sem_post");return NULL;}}
}
int main(int argc, const char *argv[])
{if(sem_init(&sem1,0,1)<0){ERR_MSG("sem init");                                                                                                                                                                                                                                                                    return -1;}if(sem_init(&sem2,0,0)<0){ERR_MSG("sem init");return -1;}pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,myread,NULL)!=0){fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);return -1;}if(pthread_create(&tid2,NULL,mywrite,NULL)!=0){fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);sem_destroy(&sem1);sem_destroy(&sem2);return 0;
} 

 

 

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

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

相关文章

3分钟白话RocketMQ系列—— 核心概念

白话3分钟&#xff0c;快速了解RocketMQ基础&#xff0c;包括适用场景&#xff0c;以及基本概念。 看完如果不了解&#xff0c;欢迎来打我。 关键字摘要 低延迟、高可用、高可靠、高并发 的消息中间件适合在线业务分为producer、consumer、nameserver、broker等角色另外还有主…

【C++】STL——stack和queue的模拟实现、空间适配器、deque的介绍、增删查改函数的简单实现

文章目录 1.deque的简单介绍2.模拟实现stack3.模拟实现queue 1.deque的简单介绍 deque的介绍文档 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可以在头尾两端进行插入和删除操作&#xff0c;且时间复杂度…

15 springboot项目——thymeleaf语法与关闭模板引擎

15.1 thymeleaf语法 在html文件中&#xff0c;有些是需要使用本地的css样式&#xff0c;使用thymeleaf语法加载&#xff1a; 首先对head标签上面的html标签进行更改&#xff1a; <html lang"en" xmlns:th"http://www.thymeleaf.org"> 其次&#xff…

Ajax快速入门

文章目录 Ajax原生ajaxaxios案例 Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试是对系统…

解决 idea maven依赖引入失效,无法正常导入依赖问题

解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题 idea是真的好用&#xff0c;不过里面的maven依赖问题有时候还真挺让人头疼&#xff0c;不少小…

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…

数学建模-元胞自动机

clc clear n 300; % 定义表示森林的矩阵大小 Plight 5e-6; Pgrowth 1e-2; % 定义闪电和生长的概率 UL [n,1:n-1]; DR [2:n,1]; % 定义上左&#xff0c;下右邻居 vegzeros(n,n); % 初始化表示森林的矩阵 imh ima…

Python实现(条形码,二维码)生成识别

Python实现&#xff08;二维码&#xff0c;条形码&#xff09;生成识别 生成条形码生成二维码识别条形码二维码 生成条形码 安装barcode模块: $ pip install python-barcode barcode文档 import barcode from barcode.writer import ImageWriter # 更多了解&#xff1a;https…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…

【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析、模型建立及参考文献

【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析、模型建立和参考文献 1 题目 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等高科技领域中有着广泛的应用。 目前&#…

Centos7 上安装 redis-dump 和redis-load 命令

一、安装rvm 1、安装GPG keys gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL http://rvm.io/mpapis.asc | gpg2 --import - curl -sSL http://rvm.io/pkuczynski.asc | g…