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 定义: 服务器表明请求的资源已永久移动到一个新…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
