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;
}
相关文章:

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("分支线程中&…...

读元宇宙改变一切笔记04_网络化
1. 思想实验 1.1. 如果森林中的一棵树倒下,但周围没有人听到,那它是否会发出声音? 1.1.1. “贝克莱的树” 1.2. 主观唯心主义哲学家乔治贝克莱(George Berkeley)提出的,他认为“存在就是被感知” 1.2.1. 如果有人或有其他事物…...
用Promise实现util函数
有些时候,我们需要依赖于异步的返回结果做一些后续处理,until函数在这种场景下非常有用,你能实现它吗 ? 让我们来试试吧 👇: <script setup langts> import { ref,watch } from "vue"const count ref(0)/*** I…...

使用numpy处理图片——白色背景变全透明
在《使用numpy处理图片——基础操作》一文中,我们通过对所有像素的alpha值做修改,让图片变成半透明。 我们看到本来是黑色的字体也因为半透明的原因变得颜色比较淡。 本文我们将判断每个像素的RGB值。如果是纯白底色,则将该像素的alpha值调…...
计算机网络层之ICMP与IGMP
计算机网络传输层协议有:tcp和udp,这两个接触最多,较为熟悉。除此之外,还有ICMP和IGMP,我们接触较少。 ICMP(Internet Control Message Protocol)和IGMP(Internet Group Management Protocol)是…...

FlinkAPI开发之自定义函数UDF
案例用到的测试数据请参考文章: Flink自定义Source模拟数据流 原文链接:https://blog.csdn.net/m0_52606060/article/details/135436048 概述 用户自定义函数(user-defined function,UDF),即用户可以根据…...

阿里云国际服务器设置安全防护程序
阿里云云服务器(ECS)提供弹性、安全、高性能、高性价比的虚拟云服务器,满足您的所有需求。立即在这里免费注册! 常见 Web 应用程序 请勿对 Web 服务控制台(如 WDCP、TOMCAT、Apache、Nginx、Jekins、PHPMyAdmin、Web…...
C++获取内存使用情况
在程序编程过程中,为了防止出现内存泄漏情况出现,需要持续关注内存程序内存占用情况。如下方式实现获取当前进程内存使用情况: linux: void my_top(string path, bool flag) {if(flag){FILE* read_top fopen("/proc/self/…...

CRMEB多商户短信开发
在使用CRMEB多商户系统的时候,想要二开使用其他平台的短信,这里以阿里云短信为例的具体实现方法。 一、加载阿里云短信的SDK,执行命令:composer require alibabacloud/dysmsapi-20170525 二、增加阿里云短信的驱动 1.在 crmeb\…...

Leetcode 1049 最后一块石头的重量II
题意理解: 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。 思路转化:我们可…...
【设计模式之美】SOLID 原则之二:开闭原则方法论、开闭原则如何取舍
文章目录 一. 如何理解“对扩展开放、修改关闭”?二. 修改代码就意味着违背开闭原则吗?三. 如何做到“对扩展开放、修改关闭”?四. 如何在项目中灵活应用开闭原则? 一. 如何理解“对扩展开放、修改关闭”? 具体的说&a…...
Kafka 基本概念和术语
1、消息 Record:Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。 2、主题 Topic:主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。在Kafka 中发布订阅的对象是 Topic。 3、分区 Partition…...
【每日面试题】Docker常见面试题精选
什么是Docker容器? Docker容器是一种轻量级的虚拟化技术,可以将应用及其依赖项打包在一个可移植的容器中,以便在多个环境中运行。 Docker镜像和容器之间有什么区别? Docker镜像是一个包含了应用程序及其依赖项的只读模板…...

uniapp项目怎么删除顶部导航栏
uniapp去掉顶部导航的方法: 1、去掉所有导航栏 "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "uni-app", "navigationBarBackgroundColor": "#007AFF"…...
Midjourney词库
光线与影子篇 闪耀的霓虹灯 shimmeringneon lights 黑暗中的影子 shadows in the dark 照亮城市的月光 moonlightilluminatingthe city 强烈的阳光 strong sunlight 熠熠生辉的霓虹灯 glittering neon lights 黑暗中的神秘影子 mysterious shadows in the dark 照亮城市…...
【微服务】springcloud集成skywalking实现全链路追踪
目录 一、前言 二、环境准备 2.1 软件环境 2.2 微服务模块 2.3 环境搭建...
openssl3.2 - 官方dmeo学习 - server-cmod.c
文章目录 openssl3.2 - 官方dmeo学习 - server-cmod.c概述配置文件格式样例笔记END openssl3.2 - 官方dmeo学习 - server-cmod.c 概述 从配置文件中读参数, 建立TLS服务器, 死等客户端来连接. 客户端连接后, 打印客户端发来的内容. 配置文件格式有要求 配置文件格式样例 # …...

websocket介绍并模拟股票数据推流
Websockt概念 Websockt是一种网络通信协议,允许客户端和服务器双向通信。最大的特点就是允许服务器主动推送数据给客户端,比如股票数据在客户端实时更新,就能利用websocket。 Websockt和http协议一样,并不是设置在linux内核中&a…...
Python获取本机IP
以下代码Python3.11.6、MacOS系统中测试通过 import socketdef get_ip() -> str:with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:s.settimeout(0)try:# doesnt even have to be reachables.connect((10.254.254.254, 1))IP s.getsockname()[0]except Except…...

HTTP 3xx状态码:重定向的场景与区别
HTTP 状态码是服务器响应请求时传递给客户端的重要信息。3xx 系列的状态码主要与重定向有关,用于指示请求的资源已被移动到不同的位置,需要采取不同的操作来访问。 一、301 Moved Permanently 定义: 服务器表明请求的资源已永久移动到一个新…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...