当前位置: 首页 > 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;
}

相关文章:

IO进程线程day5

1.实现互斥机制 #include <head.h>char buf[128]; //全局数组&#xff0c;临界资源//1、创建一个互斥锁 pthread_mutex_t mutex;//定义分支线程 void *task(void *arg) {while(1){//3、获取锁资源pthread_mutex_lock(&mutex);printf("分支线程中&…...

读元宇宙改变一切笔记04_网络化

1. 思想实验 1.1. 如果森林中的一棵树倒下&#xff0c;但周围没有人听到&#xff0c;那它是否会发出声音&#xff1f; 1.1.1. “贝克莱的树” 1.2. 主观唯心主义哲学家乔治贝克莱(George Berkeley)提出的&#xff0c;他认为“存在就是被感知” 1.2.1. 如果有人或有其他事物…...

用Promise实现util函数

有些时候&#xff0c;我们需要依赖于异步的返回结果做一些后续处理&#xff0c;until函数在这种场景下非常有用&#xff0c;你能实现它吗 ? 让我们来试试吧 &#x1f447;: <script setup langts> import { ref,watch } from "vue"const count ref(0)/*** I…...

使用numpy处理图片——白色背景变全透明

在《使用numpy处理图片——基础操作》一文中&#xff0c;我们通过对所有像素的alpha值做修改&#xff0c;让图片变成半透明。 我们看到本来是黑色的字体也因为半透明的原因变得颜色比较淡。 本文我们将判断每个像素的RGB值。如果是纯白底色&#xff0c;则将该像素的alpha值调…...

计算机网络层之ICMP与IGMP

计算机网络传输层协议有&#xff1a;tcp和udp&#xff0c;这两个接触最多&#xff0c;较为熟悉。除此之外&#xff0c;还有ICMP和IGMP&#xff0c;我们接触较少。 ICMP&#xff08;Internet Control Message Protocol&#xff09;和IGMP(Internet Group Management Protocol)是…...

FlinkAPI开发之自定义函数UDF

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 用户自定义函数&#xff08;user-defined function&#xff0c;UDF&#xff09;&#xff0c;即用户可以根据…...

阿里云国际服务器设置安全防护程序

阿里云云服务器&#xff08;ECS&#xff09;提供弹性、安全、高性能、高性价比的虚拟云服务器&#xff0c;满足您的所有需求。立即在这里免费注册&#xff01; 常见 Web 应用程序 请勿对 Web 服务控制台&#xff08;如 WDCP、TOMCAT、Apache、Nginx、Jekins、PHPMyAdmin、Web…...

C++获取内存使用情况

在程序编程过程中&#xff0c;为了防止出现内存泄漏情况出现&#xff0c;需要持续关注内存程序内存占用情况。如下方式实现获取当前进程内存使用情况&#xff1a; linux&#xff1a; void my_top(string path, bool flag) {if(flag){FILE* read_top fopen("/proc/self/…...

CRMEB多商户短信开发

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

Leetcode 1049 最后一块石头的重量II

题意理解&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。 思路转化&#xff1a;我们可…...

【设计模式之美】SOLID 原则之二:开闭原则方法论、开闭原则如何取舍

文章目录 一. 如何理解“对扩展开放、修改关闭”&#xff1f;二. 修改代码就意味着违背开闭原则吗&#xff1f;三. 如何做到“对扩展开放、修改关闭”&#xff1f;四. 如何在项目中灵活应用开闭原则&#xff1f; 一. 如何理解“对扩展开放、修改关闭”&#xff1f; 具体的说&a…...

Kafka 基本概念和术语

1、消息 Record&#xff1a;Kafka 是消息引擎嘛&#xff0c;这里的消息就是指 Kafka 处理的主要对象。 2、主题 Topic&#xff1a;主题是承载消息的逻辑容器&#xff0c;在实际使用中多用来区分具体的业务。在Kafka 中发布订阅的对象是 Topic。 3、分区 Partition&#xf…...

【每日面试题】Docker常见面试题精选

什么是Docker容器&#xff1f; Docker容器是一种轻量级的虚拟化技术&#xff0c;可以将应用及其依赖项打包在一个可移植的容器中&#xff0c;以便在多个环境中运行。 Docker镜像和容器之间有什么区别&#xff1f; Docker镜像是一个包含了应用程序及其依赖项的只读模板&#xf…...

uniapp项目怎么删除顶部导航栏

uniapp去掉顶部导航的方法&#xff1a; 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是一种网络通信协议&#xff0c;允许客户端和服务器双向通信。最大的特点就是允许服务器主动推送数据给客户端&#xff0c;比如股票数据在客户端实时更新&#xff0c;就能利用websocket。 Websockt和http协议一样&#xff0c;并不是设置在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 系列的状态码主要与重定向有关&#xff0c;用于指示请求的资源已被移动到不同的位置&#xff0c;需要采取不同的操作来访问。 一、301 Moved Permanently 定义&#xff1a; 服务器表明请求的资源已永久移动到一个新…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...