线程有规律循环打印输出,线程拷贝图片运用

news2024/12/25 12:31:52

1:线程打印循环(保证循环顺序输出)

使用互斥锁和条件变量实现:

 #include <stdio.h>
 #include <pthread.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <semaphore.h>
 
 pthread_t tid1,tid2,tid3;//创建三个线程
 pthread_cond_t cond1,cond2,cond3;//创建三个条件变量
 pthread_mutex_t mutex1;//创建三个互斥锁
 int flag = 0;
 int len =0;
 void* callBack1(void* arg)//子线程的执行体
 {
     while(1)
     {
         pthread_mutex_lock(&mutex1);//上锁
     if(flag != 0)
     {
         pthread_cond_wait(&cond1,&mutex1);
     }
     printf("A ");
     flag = 1;
 
     pthread_cond_signal(&cond2);
     pthread_mutex_unlock(&mutex1);//解锁
     }
     return NULL;
 }
 void* callBack2(void* arg)
 {
     while(1)
     {
         pthread_mutex_lock(&mutex1);//上锁
     if(flag != 1)
     {
         pthread_cond_wait(&cond2,&mutex1);
     }
     printf("B ");
     flag = 2;
 
     pthread_cond_signal(&cond3);
     pthread_mutex_unlock(&mutex1);//解锁   
     }
     return NULL;
 
 }
 void* callBack3(void* arg)
 {
     while(1)
     {
         pthread_mutex_lock(&mutex1);//上锁
     if(flag != 2)
     {
         pthread_cond_wait(&cond3,&mutex1);
     }
     printf("C ");
     flag = 0;
 
     pthread_cond_signal(&cond1);
     pthread_mutex_unlock(&mutex1);//解锁  
     }
     return NULL;
 }
 
 
 int main(int argc, const char *argv[])
 {
     pthread_mutex_init(&mutex1,NULL);//创建一个互斥锁
 
     pthread_cond_init(&cond1,NULL);//创建条件变量
     pthread_cond_init(&cond2,NULL);
     pthread_cond_init(&cond3,NULL);
 
     if(pthread_create(&tid1,NULL,callBack1,&mutex1)!=0)
     {
         perror("pthread_creadte");
         return -1;
     }
     printf("线程1创建成功\n");
     if(pthread_create(&tid2,NULL,callBack2,&mutex1)!=0)
     {
         perror("pthread_creat");\
             return -1;
     }
     printf("线程2创建成功\n");
     if(pthread_create(&tid3,NULL,callBack3,&mutex1)!=0)
     {
         perror("pthread_creat");
             return -1;
     }
     printf("线程3创建成功\n");
 
 
     pthread_join(tid1,NULL);
 
     pthread_mutex_destroy(&mutex1);//销毁互斥锁
 
     return 0;
 }                                                                 
                                                                   
                                                                   

结果图:

2:线程分开拷贝图片

#include <stdio.h>
  2 #include <pthread.h>
  3 #include <sys/types.h>
  4 #include <unistd.h>
  5 #include <sys/stat.h>
  6 #include <semaphore.h>
  7 #include <fcntl.h>
  8 #include <errno.h>
  9 pthread_t tid,tid1;
 10 sem_t sem;
 11 off_t len;
 12 void* one_pthread(void* arg)
 13 {
 14     printf("前部分\n");
 15     sem_wait(&sem);
 16 
 17     int fp = open("./photo.jpg",O_RDONLY);
 18     if(fp < 0)
 19     {
 20         perror("open");
 21     }
 22     int fp1 = open("copy.jpg",O_WRONLY);
 23     if(fp1 <0 )
 24     {
 25         perror("open");
 26     }
 27     off_t len = lseek(fp,0,SEEK_END);//计算图片总大小并返回字节数
 28     char n;
 29     lseek(fp,0,SEEK_SET);
 30     lseek(fp1,0,SEEK_SET);
 31     for(int i=0;i<len/2;i++)
 32     {
 33         read(fp,&n,1);
 34         write(fp1,&n,1);
 35     }
 36     printf("前半部分拷贝完成\n");
 37 
 38     sem_post(&sem);
 39     pthread_exit(NULL);
 40 }
 41 
 42 void* two_pthread(void* arg)
 43 {
 44     sleep(1);
 45     printf("后半部分\n");
 46     sem_wait(&sem);
 47     //打开拷贝的图片
 48         int fp = open("./photo.jpg",O_RDONLY);
 49     if(fp < 0)
 50     {
 51         perror("open");
 52     }
 53     //打开拷贝到的文件
 54     int fp1 = open("copy.jpg",O_WRONLY);
 55     if(fp1 < 0)
 56     {
 57         perror("open");
 58     }
 59     len = lseek(fp,0,SEEK_END);//计算图片总大小并返回字
 60     char n;
 61     lseek(fp,len/2,SEEK_SET);
 62     lseek(fp1,len/2,SEEK_SET);
 63     //进行拷贝                                                                                             
 64     for(int i=len/2;i<len;i++)
 65     {
 66         read(fp,&n,1);
 67         write(fp1,&n,1);
 68     }
 69     printf("后半部分拷贝完成\n");
 70     sem_post(&sem);
 71     pthread_exit(NULL);
 72 }
 73 int main(int argc, const char *argv[])
 74 {
 75     //打开一个用于拷贝的空文件
 76     int fp = open("copy.jpg",O_WRONLY|O_CREAT|O_TRUNC,0665);
 77     if(fp <0)
 78     {
 79         perror("openn");
 80         return -1;
 81     }
 82     //创建一个信号灯
 83     sem_init(&sem,0,1);
 84 
 85     if(pthread_create(&tid,NULL,one_pthread,NULL) !=0)
 86     {
 87         perror("pthread_create");
 88         return -1;
 89     }
 90     if(pthread_create(&tid1,NULL,two_pthread,NULL) !=0)
 91     {
 92         perror("pthread_create");
 93         return -1;
 94     }
 95 
 96     pthread_join(tid,NULL);//阻塞线程,防止直接退出
 97     pthread_join(tid1,NULL);
 98     sem_destroy(&sem);
 99     return 0;
}

结果图:

3:无名管道,父给子赋值

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
    int  pfd[2];
    if(pipe(pfd)<0)
    {
        perror("pipe");
        return -1;
    }
    printf("创建管道成功! %d %d\n",pfd[0],pfd[1]);
    char buf[128] = "";
    pid_t pid = fork();
    if(pid>0)                                             
    {
        while(1)
        {
            fgets(buf,sizeof(buf),stdin);
            buf[strlen(buf)-1] = '\0';
            if(write(pfd[1],buf,sizeof(buf))<0)
            {
                perror("write");
                return -1;
            }
            printf("写入成功! %s __%d__\n",buf,__LINE__);
        }
    }
    else if(pid == 0)
    {
        ssize_t res;
        while(1)
        {
            res= read(pfd[0],buf,sizeof(buf));
            if(res <0 )
            {
                perror("read");
                return -1;
            }
            printf("res=%ld %s __&d__\n",res,buf,__LINE__)
        }
    }
    else
    {
        perror("fork");
        return -1;
    }
    return 0;
}   

结果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SAP-ABAP】-权限批导-批量给某个角色导入事务码权限

需求&#xff1a;SAP期初上线的时候&#xff0c;业务顾问经常会遇到批量创建角色和分配角色权限的情况 岗位需求&#xff1a;一般是业务顾问定义权限&#xff0c;BASIS进行后期运维&#xff0c;今天讲两个批导功能&#xff0c;方便期初上线 主要函数&#xff1a;PRGN_READ_ROLE…

群体优化算法----多乌鸦搜寻算法介绍,找多目标函数组解,Pareto前沿

介绍 乌鸦搜寻算法&#xff08;Crow Search Algorithm&#xff0c;CSA&#xff09;是一种新型的群体智能优化算法&#xff0c;其灵感来源于乌鸦的行为特性&#xff0c;尤其是乌鸦在食物搜寻和藏匿过程中的智能行为。乌鸦是一种高度聪明的鸟类&#xff0c;它们展示出复杂的社会…

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

自适应巡航控制技术规范(简化版)

自适应巡航控制技术规范(简化版) 1 系统概述2 功能需求3 性能需求4 功能激活条件5 功能抑制条件6 系统局限性1 系统概述 ACC 自适应巡航系统可自动控制纵向跟车距离,减轻驾驶员的工作量,即驾驶员无需频繁的踩制动和油门便可完成部分的驾驶任务,但责任主体仍然是驾驶员,驾…

OrangePi AIpro测评:性能、应用与开发者体验解析

一、OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4K高…

SPI转四串口芯片CH9434的设计

一、CH9434的介绍 CH9434 是一款SPI转四串口转接芯片&#xff0c;提供四组全双工的9线异步串口&#xff0c;用于单片机/嵌入式系统扩展异步串口。CH9434包含四个兼容16C550的异步串口&#xff0c;最高支持4Mbps波特率通讯。最多支持25 路GPIO&#xff0c;提供半双工收发自动切换…

Rust基础学习-ModulesPackage

在Rust中&#xff0c;模块有助于将程序分割成逻辑单元&#xff0c;以提高可读性和组织性。一旦程序变得更大&#xff0c;将其拆分为多个文件或命名空间非常重要。 模块有助于构建我们的程序。模块是项目的集合&#xff1a;包括函数、结构体甚至其他模块。 Module 定义模块 在…

嵌入式硬件VS软件,到底哪个更难?

在嵌入式系统开发中&#xff0c;硬件和软件是密不可分的两个方面。但是&#xff0c;究竟是硬件开发更具挑战性&#xff0c;还是软件开发更难以应对呢&#xff1f;本文将就这一问题展开讨论&#xff0c;探究嵌入式硬件和软件在开发过程中的各种挑战与特点。 一、硬件开发&#…

12.实战私有数据微调ChatGLM3

实战私有数据微调ChatGLM3 实战私有数据微调ChatGLM3实战构造私有的微调数据集基于 ChatGPT 设计生成训练数据的 Prompt使用 LangChain GPT-3.5-Turbo 生成训练数据样例训练数据解析、数据增强和持久化存储自动化批量生成训练数据集流水线提示工程&#xff08;Prompt Engineer…

HTTPS请求阶段图解分析

HTTPS请求阶段分析 请求阶段分析 请求阶段分析 一个完整、无任何缓存、未复用连接的 HTTPS 请求需要经过以下几个阶段&#xff1a; DNS 域名解析、TCP 握手、SSL 握手、服务器处理、内容传输。 一个 HTTPS 请求共需要 5 个 RTT 1 RTT&#xff08;域名解析&#xff09; 1 RTT…

element table 点击某一行中按钮加载

在Element UI中&#xff0c;实现表格&#xff08;element-table&#xff09;中的这种功能通常涉及到数据处理和状态管理。当你点击某一行的按钮时&#xff0c;其他行的按钮需要动态地切换为加载状态&#xff0c;这可以通过以下步骤实现&#xff1a; 1.表格组件&#xff1a;使用…

NodeClub:NodeJS构造开源交流社区

NodeClub&#xff1a; 连接每一个想法&#xff0c;NodeClub让社区更生动- 精选真开源&#xff0c;释放新价值。 概览 NodeClub是一个基于Node.js和MongoDB构建的社区系统&#xff0c;专为开发者和社区爱好者设计。它提供了一套完整的社区功能&#xff0c;包括用户管理、内容发…

基于 Nginx Ingress + 云效 AppStack 实现灰度发布

作者&#xff1a;子丑 场景简介 灰度发布是降低生产部署风险&#xff0c;提升线上服务稳定性的重要手段&#xff0c;这在当前快速迭代的软件研发中尤为重要。相对于 K8s 默认的滚动部署或者简单的 Pod 分批&#xff0c;基于流量特征的灰度发布验证更精准&#xff0c;风险更低…

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包&#xff0c;可以拿到包含flag的txt文件。…

buuctf----warmup_csaw_2016

进来医院先来一套常规检查 啥保护都没,看大佬说基本栈溢出 CT一看 OK cat flag 更喜欢了 40060D 找到地址 get也来了,稳啦! 0x80-0x40 8 根据上道题的exp from pwn import * ghust remote("node5.buuoj.cn",27229) addr 0x40060D payload bA * 0x40 bB*8…

SpringMVC-基础架构

一、什么是MVC 二、什么是SpringMVC 三、SpringMVC的特点 四、配置SpringMVC 简单流程&#xff1a; 总体框架 1.创建pom.xml依赖 <!--打包方式--><packaging>war</packaging><!--依赖--><dependencies><dependency><groupId>org.s…

路由器怎么设置局域网?

局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是指在一个相对较小的地理范围内&#xff0c;如家庭、办公室或学校等&#xff0c;通过路由器等设备连接起来的计算机网络。设置局域网可以方便地实现内部资源共享和信息交流。本文将介绍如何设置局域网以及一个…

C# 设置PDF表单不可编辑、或提取PDF表单数据

PDF表单是PDF中的可编辑区域&#xff0c;允许用户填写指定信息。当表单填写完成后&#xff0c;有时候我们可能需要将其设置为不可编辑&#xff0c;以保护表单内容的完整性和可靠性。或者需要从PDF表单中提取数据以便后续处理或分析。 之前文章详细介绍过如何使用免费Spire.PDF…

晶振的匹配电容的计算

晶振 等效电路 C0是晶振的静态电容 L1是晶振的等效电感 C1是晶振的等效电容 R1是晶振的等效串联电阻 芯片内部已有反相器和负载电阻 计算公式 参考1 参考2

maven 显式依赖包包含隐式依赖包,引起依赖包冲突

问题&#xff1a;FlinkCDC 3.0.1 代码 maven依赖包冲突 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包&#xff0c;有多个不同的版本&#xff0c;因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它…