当前位置: 首页 > news >正文

IO进程线程day5

1.实现互斥机制

#include <head.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){//3、获取锁资源pthread_mutex_lock(&mutex);printf("主线程中buf = %s\n", buf);       //访问临界资源strcpy(buf, "hello world\n");  //4、释放锁资源pthread_mutex_unlock(&mutex);}pthread_join(tid, NULL);         //阻塞回收线程资源//5、销毁锁资源pthread_mutex_destroy(&mutex);return 0;
}

2.实现同步机制

#include <head.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;//2、初始化无名信号量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);//5、销毁无名信号量sem_destroy(&sem);return 0;
}

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

  1 #include <head.h>2 sem_t sem;3 struct Info4 {5     int fd1;6     int fd2;7     int size;8 };910 void *task1(void *buf)11 {12     //不断得将源文件中的内容读出,并写入的目标文件中                                                                                                                                                       13     //直到源文件读取一半结束14     char buf1[1] = "";15     int count=0;16     lseek(((struct Info*)buf)->fd1,0,SEEK_SET);17     while(1)18     {19         memset(buf1, 0, sizeof(buf1));    //将容器清空20         int res = read(((struct Info*)buf)->fd1, buf1, sizeof(buf1));   //从源文件中读取数据21         count+=res;22         //对读取的数据个数进行判断23         if(count>((struct Info*)buf)->size/2)24         {25             break;26         }27         write(((struct Info*)buf)->fd2, buf1, res);     //将数据写入目标文件28     }sem_post(&sem);29     pthread_exit(NULL);30 }31 void *task2(void *buf)32 {33     sem_wait(&sem);34     lseek(((struct Info*)buf)->fd1,(((struct Info *)buf)->size)/2,SEEK_SET);35     //不断得将源文件中的内容读出,并写入的目标文件中36     //直到源文件读取后一半结束37     char buf2[128] = "";38     while(1)39     {40         memset(buf2, 0, sizeof(buf2));    //将容器清空41         int res = read(((struct Info *)buf)->fd1, buf2, sizeof(buf2));   //从源文件中读取数据42         //对读取的数据个数进行判断43         if(res==0)44         {45             break;46         }47         write(((struct Info*)buf)->fd2, buf2, res);     //将数据写入目标文件48     }49     pthread_exit(NULL);50 }51 int main(int argc, const char *argv[])52 {53     //判断传入的文件个数54     if(argc != 3)55     {56         printf("input file error\n");57         printf("usage:./a.out srcfile dstfile\n");58         return -1;59     }60     //定义文件描述符变量61     int fd1, fd2;62     //以只读的形式打开源文件63     if((fd1 = open(argv[1], O_RDONLY)) ==-1)64     {65         perror("open srcfile error");66         return -1;67     }68     //以只写的形式打开目标文件69     if((fd2 = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0664)) ==-1)70     {71         perror("open dstfile error");72         return -1;73     }74     sem_init(&sem, 0, 0);75     unsigned int size;76     size = lseek(fd1, 0, SEEK_END);77     struct Info buf = {fd1, fd2, size};78     //定义一个线程号变量79     pthread_t tid1,tid2;80     //创建出一个分支线程81     if(pthread_create(&tid1, NULL, task1, &buf) != 0)82     {83         printf("tid create error\n");84         return -1;85     }86     if(pthread_create(&tid2, NULL, task2, &buf) != 0)87     {88         printf("tid create error\n");89         return -1;90     }91     pthread_join(tid1, NULL);92     pthread_join(tid2, NULL);93     sem_destroy(&sem);94     close(fd1);95     close(fd2);96     return 0;97 }

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

#include <head.h>
sem_t sem1,sem2,sem3;//无名信号量void *task1(void *arg)
{while(1){sem_wait(&sem1);//询问当前任务的无名信号量(下同)putchar('A');fflush(stdout);//刷新缓冲区(下同)sleep(1);sem_post(&sem2);//将下一个任务的无名信号量改变为1(下同)}
}
void *task2(void *arg)
{while(1){sem_wait(&sem2);putchar('B');fflush(stdout);sleep(1);sem_post(&sem3);}
}
void *task3(void *arg)
{while(1){sem_wait(&sem3);putchar('C');fflush(stdout);sleep(1);sem_post(&sem1);}
}
int main(int argc, const char *argv[])
{//无名信号量初始化sem_init(&sem1,0,1);sem_init(&sem2,0,0);sem_init(&sem3,0,0);//定义三个线程pthread_t tid1,tid2,tid3;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("error1\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("error2\n");return -1;}if(pthread_create(&tid3,NULL,task3,NULL)!=0){printf("error3\n");return -1;}//进程收尸pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);return 0;
}

http://www.lryc.cn/news/277826.html

相关文章:

  • 读元宇宙改变一切笔记04_网络化
  • 用Promise实现util函数
  • 使用numpy处理图片——白色背景变全透明
  • 计算机网络层之ICMP与IGMP
  • FlinkAPI开发之自定义函数UDF
  • 阿里云国际服务器设置安全防护程序
  • C++获取内存使用情况
  • CRMEB多商户短信开发
  • Leetcode 1049 最后一块石头的重量II
  • 【设计模式之美】SOLID 原则之二:开闭原则方法论、开闭原则如何取舍
  • Kafka 基本概念和术语
  • 【每日面试题】Docker常见面试题精选
  • uniapp项目怎么删除顶部导航栏
  • Midjourney词库
  • 【微服务】springcloud集成skywalking实现全链路追踪
  • openssl3.2 - 官方dmeo学习 - server-cmod.c
  • websocket介绍并模拟股票数据推流
  • Python获取本机IP
  • HTTP 3xx状态码:重定向的场景与区别
  • LangChain 69 向量数据库Pinecone入门
  • 解决STM32F7系列芯片TIM无法触发ADC采样的问题
  • 观察者设计模式
  • 创建mysql普通用户
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(中)完整代码
  • Fluids —— Fluid sourcing
  • MongoDB相关问题及答案(2024)
  • 前端系列:ES6-ES12新语法
  • 226.【2023年华为OD机试真题(C卷)】精准核酸检测(并查集-JavaPythonC++JS实现)
  • 浅谈MySQL之索引
  • Rust类型之字符串