华清远见作业第二十二天——IO(第五天)

2024-01-07 03:44

本文主要是介绍华清远见作业第二十二天——IO(第五天),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

思维导图:

 将互斥机制代码重新实现一遍

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<a.h>
char buf[128]; //全局数组,临界资源
//1、创建一个互斥锁
pthread_mutex_t mutex;
//定义分支线程
void *task(void *arg)
{while(1){//3、获取锁资源pthread_mutex_lock(&mutex);printf("分支线程中:buf=%s\n",buf);strcpy(buf,"I love China\n");//4释放锁资源pthread_mutex_unlock(&mutex);}
}
int main(int argc, const char *argv[])
{//定义线程号变量pthread_t tid;//2初始化互斥锁pthread_mutex_init(&mutex,NULL);//创建线程if(pthread_create(&tid,NULL,task,NULL)!=0){printf("tid create error\n");return -1;}//主线程while(1){//获取锁资源pthread_mutex_lock(&mutex);printf("主线程中buf=%s\n",buf); 	//访问临界资源strcpy(buf,"hello world\n");//释放锁资源pthread_mutex_unlock(&mutex);}pthread_join(tid,NULL);      	//阻塞回收线程资源//销毁锁资源pthread_mutex_destroy(&mutex);return 0;
}

运行效果:

将同步机制代码重新实现一遍

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <a.h>
//1创建一个无名信号量
sem_t sem;
//生产者线程
void *task1(void *arg)
{while(1){sleep(2);printf("我生产了一辆特斯拉\n");//4释放资源sem_post(&sem);}
}
//消费者线程
void *task2(void *arg)
{while(1){//3申请资源,如果没有资源sem_wait(&sem);printf("我消费了一辆特斯拉\n");}
}
int main(int argc, const char *argv[])
{//创建两个线程pthread_t tid1,tid2;//初始化无名信号量sem_init(&sem,0,0);//第一个0:表示线程之间的通信//第二个0:表示value初始值为0//创建生产者线程if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return -1;}//创建消费者线程if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return -1;}//主线程回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//销毁无名信号量sem_destroy(&sem);return 0;
}

运行效果:

 

使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源。

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<a.h>
//定义传参结构体
struct INFO
{const char *r;	//读取的文件const char *w;	//写入的文件int start;	//开始位置int len;	//长度
};
//定义求文档长度函数
int lenstr(const char *r)
{//以只读的形式打开源文件FILE *rfp=NULL;if((rfp=fopen(r,"r"))==NULL){perror("rfp error");return -1;}//使用fseek和ftell函数定位到文件的数量//fseek(文件指针,偏移量,开始的位置)//ftell(文件中指针),直接返回文件的位置,既把指针最后的位置,返回文件数量int len=0;    //计数	fseek(rfp,0,SEEK_END);	//光标偏移到文件最后的位置len=ftell(rfp);   //返回值就是文件的数量fclose(rfp);return len;
}
//定义拷贝函数
int file_cpy(const char *r,const char *w,int start, int len)
{	char buf[128]="";	//数据搬运工//以只读的形式打开源文件FILE *rfp=NULL;if((rfp=fopen(r,"r"))==NULL){perror("rfp error");return -1;}//以追加写的形式打开被写的文件FILE *wfp=NULL;if((wfp=fopen(w,"a"))==NULL){perror("wfp error");return -1;}//bzero(清零的地址,空间字节数)//防止buf中有内容影响操作//bzero(buf,sizeof(buf));	//清零buf//由于读文件已经打开,故需要把光标定位到开头fseek(rfp,start,SEEK_SET); //光标定位到开始偏移的位置//由于需要限制位置,所以使用fread函数来进行读取int count=fread(buf,sizeof(buf[0]),len,rfp);//写入使用fwrite函数fwrite(buf,sizeof(buf[0]),count,wfp);//关闭文件fclose(rfp);fclose(wfp);return 0;
}
void *task1(void *arg)
{while(1){struct INFO * fap = (struct INFO *)arg;//调用文件拷贝函数进行拷贝file_cpy(fap->r,fap->w,fap->start,fap->len);		printf("我是分支线程1\n");sleep(1);//将输入的拷贝函数的各个参数分解//将输入的拷贝函数的各参数结构体拆包到一个结构体变量中//获取当前线程的线程号printf("我是分支线程1:tid1=%#lx\n",pthread_self());//退出当前线程printf("分支线程1资源退出\n");pthread_exit(NULL);}
}
void *task2(void *arg)
{while(1){printf("我是分支线程2\n");sleep(1);//将输入的拷贝函数的各个参数分解struct INFO * fap = (struct INFO *)arg;//调用文件拷贝函数进行拷贝file_cpy(fap->r,fap->w,fap->start,fap->len);	printf("我是分支线程1:tid1=%#lx\n",pthread_self());//退出当前线程printf("分支线程2资源退出\n");pthread_exit(NULL);	}
}
int main(int argc, const char *argv[])
{if(argc!=3){printf("内容错误\n");return -1;}int len=lenstr(argv[1]);//定义结构体变量struct INFO t1={argv[1],argv[2],0,len/2};struct INFO t2={argv[1],argv[2],len/2,len-len/2};//定义一个线程号变量pthread_t tid1=0;	//创建出一个分支线程if(pthread_create(&tid1,NULL,task1,&t1)!=0){printf("tid1 create error\n");return -1;}printf("tid1 create success tid=%#lx\n",tid1);//创建一个分支线程pthread_t tid2=0;if(pthread_create(&tid2,NULL,task2,&t2)!=0){printf("tid2 create error\n");return -1;}printf("tid2 create success tid2=%#lx\n",tid2);
//	while(1){printf("我是主线程\n");sleep(1);}//主线程回收分支线程pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("主线程成功回收分支线程的资源\n");return 0;
}

运行效果:

使用三个线程完成线程1输出字符'A',线程2输出字符'B',线程3输出字符'C',要求输出结果为ABCABCABCABCABCABC...

代码:

#include<a.h>
//1创建一个无名信号量
sem_t sem1,sem2;
//A线程
void *task1(void *arg)
{while(1){sleep(2);printf("A");//释放资源sem_post(&sem1);}
}
//B线程资源
void *task2(void *arg)
{while(1){	//申请资源,如果没有资源则在该出堵塞sem_wait(&sem1);printf("B");//释放资源sem_post(&sem2);}
}
//B线程资源
void *task3(void *arg)
{while(1){	//申请资源,如果没有资源则在该出堵塞sem_wait(&sem2);printf("C");fflush(stdout); // 刷新 stdout 缓冲区}
}
int main(int argc, const char *argv[])
{//创建三个线程pthread_t tid1,tid2,tid3;//初始化无名信号量sem_init(&sem1,0,0);sem_init(&sem2,0,0);//第一个0:表示用于线程之间的通信//第二个0:表示value初始值为0//创建A线程if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return -1;}//创建B线程if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create\n");return -1;}//创建C线程if(pthread_create(&tid3,NULL,task3,NULL)!=0){printf("tid3 create\n");return -1;}//主线程回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);//销毁无名信号量sem_destroy(&sem1);sem_destroy(&sem2);return 0;
}

运行效果:

这篇关于华清远见作业第二十二天——IO(第五天)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578618

相关文章

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

JavaEE-文件操作与IO

目录 1,两种路径 二,两种文件 三,文件的操作/File类: 1)文件系统操作 File类 2)文件内容操作(读文件,写文件) (1)打开文件 (2)关闭文件 (3)读文件/InputStream (4)写文件/OutputStream (5)读文件/reader (6)写文件/writer (7)Scanner 四,练习: 1,两种路径 1)绝对路径

Python---文件IO流及对象序列化

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 前文模块中提到加密模块,本文将终点介绍加密模块和文件流。 一、文件流和IO流概述         在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。

标准IO与系统IO

概念区别 标准IO:(libc提供) fopen fread fwrite 系统IO:(linux系统提供) open read write 操作效率 因为内存与磁盘的执行效率不同 系统IO: 把数据从内存直接写到磁盘上 标准IO: 数据写到缓存,再刷写到磁盘上

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT