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

线程相关作业

1.创建两个线程,分支线程1拷贝文件的前一部分,分支线程2拷贝文件的后一部分

#include "head.h"#define BUFFER_SIZE 1024// 线程参数结构体,包含文件名和文件偏移量
typedef struct {FILE *src_file;FILE *dest_file;long start_offset;long length;
} ThreadArgs;// 线程1:拷贝文件的前一部分
void *copyFirstPart(void *args) {ThreadArgs *thread_args = (ThreadArgs *)args;FILE *src = thread_args->src_file;FILE *dest = thread_args->dest_file;long start_offset = thread_args->start_offset;long length = thread_args->length;// 分配缓冲区char buffer[BUFFER_SIZE];fseek(src, start_offset, SEEK_SET);long bytes_read = 0;while (bytes_read < length) {size_t read_size = (length - bytes_read < BUFFER_SIZE) ? (length - bytes_read) : BUFFER_SIZE;size_t read_count = fread(buffer, 1, read_size, src);fwrite(buffer, 1, read_count, dest);bytes_read += read_count;}printf("Thread 1 finished copying the first part.\n");return NULL;
}// 线程2:拷贝文件的后一部分
void *copySecondPart(void *args) {ThreadArgs *thread_args = (ThreadArgs *)args;FILE *src = thread_args->src_file;FILE *dest = thread_args->dest_file;long start_offset = thread_args->start_offset;long length = thread_args->length;// 分配缓冲区char buffer[BUFFER_SIZE];fseek(src, start_offset, SEEK_SET);long bytes_read = 0;while (bytes_read < length) {size_t read_size = (length - bytes_read < BUFFER_SIZE) ? (length - bytes_read) : BUFFER_SIZE;size_t read_count = fread(buffer, 1, read_size, src);fwrite(buffer, 1, read_count, dest);bytes_read += read_count;}printf("Thread 2 finished copying the second part.\n");return NULL;
}int main() {FILE *src_file = fopen("head.h", "rb");if (src_file == NULL) {perror("Error opening source file");return 1;}// 获取源文件的大小fseek(src_file, 0, SEEK_END);long file_size = ftell(src_file);fseek(src_file, 0, SEEK_SET);// 创建两个目标文件FILE *dest_file1 = fopen("part1.h", "wb");FILE *dest_file2 = fopen("part2.h", "wb");if (dest_file1 == NULL || dest_file2 == NULL) {perror("Error opening destination file");fclose(src_file);return 1;}// 创建线程pthread_t thread1, thread2;// 设置线程参数ThreadArgs args1 = {src_file, dest_file1, 0, file_size / 2};ThreadArgs args2 = {src_file, dest_file2, file_size / 2, file_size - file_size / 2};// 创建两个线程,分别拷贝前后部分pthread_create(&thread1, NULL, copyFirstPart, &args1);pthread_create(&thread2, NULL, copySecondPart, &args2);// 等待线程完成pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 关闭文件fclose(src_file);fclose(dest_file1);fclose(dest_file2);printf("File copy completed.\n");return 0;
}

2.创建3个线程,线程A打印A,线程B打印B,线程C打印C,要求重复打印顺序ABC (分别使用信号量和条件变量实现)

#include "head.h"sem_t semA, semB, semC;  // 信号量A, B, C// 线程A打印A
void* printA(void* arg) {while (1) {sem_wait(&semA);  // 等待信号量Aprintf("A\n");sleep(1);sem_post(&semB);  // 释放信号量B,通知线程B执行}return NULL;
}// 线程B打印B
void* printB(void* arg) {while (1) {sem_wait(&semB);  // 等待信号量Bprintf("B\n");sleep(1);sem_post(&semC);  // 释放信号量C,通知线程C执行}return NULL;
}// 线程C打印C
void* printC(void* arg) {while (1) {sem_wait(&semC);  // 等待信号量C                        printf("C\n");sleep(1);sem_post(&semA);  // 释放信号量A,通知线程A执行}return NULL;
}int main() {// 初始化信号量sem_init(&semA, 0, 1);  // 初始化信号量A为1,线程A先执行sem_init(&semB, 0, 0);  // 初始化信号量B为0,线程B等待线程Asem_init(&semC, 0, 0);  // 初始化信号量C为0,线程C等待线程B// 创建线程pthread_t threadA, threadB, threadC;pthread_create(&threadA, NULL, printA, NULL);pthread_create(&threadB, NULL, printB, NULL);pthread_create(&threadC, NULL, printC, NULL);// 等待线程结束(实际上永远不会结束,因为是无限循环)pthread_join(threadA, NULL);pthread_join(threadB, NULL);pthread_join(threadC, NULL);// 销毁信号量sem_destroy(&semA);sem_destroy(&semB);sem_destroy(&semC);return 0;
}

#include "head.h"// 定义条件变量和互斥锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;// 用于控制线程执行的变量
int current_thread = 0;  // 0: A, 1: B, 2: C// 线程 A
void* print_A(void* arg) {while (1) {pthread_mutex_lock(&mutex);while (current_thread != 0) {pthread_cond_wait(&cond, &mutex);  // 等待轮到线程 A}sleep(1);printf("A\n");  // 打印 Afflush(stdout);  // 刷新输出缓冲区current_thread = 1;  // 切换到线程 Bpthread_cond_broadcast(&cond);  // 唤醒其他线程pthread_mutex_unlock(&mutex);}return NULL;
}// 线程 B
void* print_B(void* arg) {while (1) {pthread_mutex_lock(&mutex);while (current_thread != 1) {pthread_cond_wait(&cond, &mutex);  // 等待轮到线程 B}                                                                  sleep(1);printf("B\n");  // 打印 Bfflush(stdout);  // 刷新输出缓冲区current_thread = 2;  // 切换到线程 Cpthread_cond_broadcast(&cond);  // 唤醒其他线程pthread_mutex_unlock(&mutex);}return NULL;
}// 线程 C
void* print_C(void* arg) {while (1) {pthread_mutex_lock(&mutex);while (current_thread != 2) {pthread_cond_wait(&cond, &mutex);  // 等待轮到线程 C}sleep(1);printf("C\n");  // 打印 Cfflush(stdout);  // 刷新输出缓冲区current_thread = 0;  // 切换到线程 Apthread_cond_broadcast(&cond);  // 唤醒其他线程pthread_mutex_unlock(&mutex);}return NULL;
}int main() {pthread_t thread_A, thread_B, thread_C;// 创建线程pthread_create(&thread_A, NULL, print_A, NULL);pthread_create(&thread_B, NULL, print_B, NULL);pthread_create(&thread_C, NULL, print_C, NULL);// 等待线程结束pthread_join(thread_A, NULL);pthread_join(thread_B, NULL);pthread_join(thread_C, NULL);return 0;
}

相关文章:

线程相关作业

1.创建两个线程&#xff0c;分支线程1拷贝文件的前一部分&#xff0c;分支线程2拷贝文件的后一部分 #include "head.h"#define BUFFER_SIZE 1024// 线程参数结构体&#xff0c;包含文件名和文件偏移量 typedef struct {FILE *src_file;FILE *dest_file;long start_o…...

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…...

【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)

【模拟CMOS集成电路设计】带隙基准&#xff08;Bandgap&#xff09;设计与仿真 前言工程文件&部分参数计算过程&#xff0c;私聊~ 一、 设计指标指标分析&#xff1a; 二、 电路分析三、 仿真3.1仿真电路图3.2仿真结果(1)运放增益(2)基准温度系数仿真(3)瞬态启动仿真(4)静态…...

如何选择国产串口屏?

目录 1、迪文 2、淘晶驰 3、广州大彩 4、金玺智控 5、欣瑞达 6、富莱新 7、冠显 8、有彩 串口屏&#xff0c;顾名思义&#xff0c;就是通过串口通信接口&#xff08;如RS232、RS485、TTL UART等&#xff09;与主控设备进行通信的显示屏。其核心功能是显示信息和接收输入…...

Solana中的程序派生地址(PDAs):是什么,为什么,以及如何?

程序派生地址 (PDA) 在 Solana 中的应用&#xff1a;什么、为什么和如何&#xff1f; 在学习 Solana 时&#xff0c;你会经常听到关于 程序派生地址 (PDAs) 的讨论。它们就像这样 —— 强大、多功能&#xff0c;而且最重要的是&#xff0c;稍微被误解。如果你是一个开发者&…...

利用FatJar彻底解决Jar包冲突(一)

利用FatJar彻底解决Jar包冲突 序FatJar的加载与隔离⼀、 FatJar概念⼆、FatJar的加载三、FatJar的隔离四、隔离机制验证五、 FatJar的定位六、 打包注意点 序 今天整理旧电脑里的资料&#xff0c;偶然翻到大概10年前实习时写的笔记&#xff0c;之前经常遇到Java依赖冲突的问题…...

Spring MVC笔记

01 什么是Spring MVC Spring MVC 是 Spring 框架中的一个核心模块&#xff0c;专门用于构建 Web 应用程序。它基于经典的 MVC 设计模式&#xff08;Model-View-Controller&#xff09;&#xff0c;但通过 Spring 的特性&#xff08;如依赖注入、注解驱动&#xff09;大幅简化了…...

BurpSuite插件jsEncrypter使用教程

一、前言 在当今Web应用安全测试中&#xff0c;前端加密已成为开发者保护敏感数据的常用手段。然而&#xff0c;这也给安全测试人员带来了挑战&#xff0c;传统的抓包方式难以获取明文数据&#xff0c;测试效率大打折扣。BurpSuite作为一款强大的Web安全测试工具&#xff0c;其…...

【C#实现手写Ollama服务交互,实现本地模型对话】

前言 C#手写Ollama服务交互&#xff0c;实现本地模型对话 最近使用C#调用OllamaSharpe库实现Ollama本地对话&#xff0c;然后思考着能否自己实现这个功能。经过一番查找&#xff0c;和查看OllamaSharpe源码发现确实可以。其实就是开启Ollama服务后&#xff0c;发送HTTP请求&a…...

Android Glide 框架线程管理模块原理的源码级别深入分析

一、引言 在现代的 Android 应用开发中&#xff0c;图片加载是一个常见且重要的功能。Glide 作为一款广泛使用的图片加载框架&#xff0c;以其高效、灵活和易用的特点受到了开发者的青睐。其中&#xff0c;线程管理模块是 Glide 框架中至关重要的一部分&#xff0c;它负责协调…...

每天记录一道Java面试题---day32

MySQL索引的数据结构、各自优劣 回答重点 B树&#xff1a;是一个平衡的多叉树&#xff0c;从根节点到每个叶子节点的高度差不超过1&#xff0c;而且同层级的节点间有指针相互连接。在B树上的常规检索&#xff0c;从根节点到叶子节点的搜索效率基本相当&#xff0c;不会出现大…...

Vue3 Pinia 符合直觉的Vue.js状态管理库

Pinia 符合直觉的Vue.js状态管理库 什么时候使用Pinia 当两个关系非常远的组件&#xff0c;要传递参数时使用Pinia组件的公共参数使用Pinia...

深度学习与大模型基础-向量

大家好&#xff01;今天我们来聊聊向量&#xff08;Vector&#xff09;。别被这个词吓到&#xff0c;其实向量在我们的生活中无处不在&#xff0c;只是我们没注意罢了。 1. 向量是什么&#xff1f; 简单来说&#xff0c;向量就是有大小和方向的量。比如你从家走到学校&#x…...

【网络编程】完成端口 IOCP

10.11 完成端口 10.11.1 基本概念 完成端口的全称是I/O 完成端口&#xff0c;英文为IOCP(I/O Completion Port) 。IOCP是一个异 步I/O 的 API, 可以高效地将I/O 事件通知给应用程序。与使用select() 或是其他异步方法不同 的是&#xff0c;一个套接字与一个完成端口关联了起来…...

《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)

目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功&#xff1a; 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具&#xff1a;Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…...

管理网络安全

防火墙在 Linux 系统安全中有哪些重要的作用&#xff1f; 防火墙作为网络安全的第一道防线&#xff0c;能够根据预设的规则&#xff0c;对进出系统的网络流量进行严格筛选。它可以阻止未经授权的外部访问&#xff0c;只允许符合规则的流量进入系统&#xff0c;从而保护系统免受…...

明日直播|Go IoT 开发平台,开启万物智联新征程

在物联网技术飞速发展的当下&#xff0c;物联网行业却深受协议碎片化、生态封闭、开发低效等难题的困扰。企业和开发者们渴望找到一个能突破这些困境&#xff0c;实现高效、便捷开发的有力工具。 3 月 11 日&#xff08;星期二&#xff09;19:00&#xff0c;GitCode 特别邀请独…...

系统架构设计师—系统架构设计篇—软件架构风格

文章目录 概述经典体系结构风格数据流风格批处理管道过滤器对比 调用/返回风格主程序/子程序面向对象架构风格层次架构风格 独立构件风格进程通信事件驱动的系统 虚拟机风格解释器基于规则的系统 仓库风格&#xff08;数据共享风格&#xff09;数据库系统黑板系统超文本系统 闭…...

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)

文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…...

【Zinx】Day5-Part4:Zinx 的连接属性设置

目录 Day5-Part4&#xff1a;Zinx 的连接属性设置给连接添加连接配置的接口连接属性方法的实现 测试 Zinx-v1.0总结 Day5-Part4&#xff1a;Zinx 的连接属性设置 在 Zinx 当中&#xff0c;我们使用 Server 来开启服务并监听指定的端口&#xff0c;当接收到来自客户端的连接请求…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...