IO day6

news2024/11/27 5:36:08

1->x.mind

2->

#include <myhead.h>
char c;
ssize_t res=1;
//互斥锁
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
//创建条件变量
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

int flag=0;//0:打印  1:倒置
void* callBack1(void* arg)
{
    int fd=open("./1.txt",O_RDONLY);
    int size=lseek(fd,0,SEEK_END);
    //将光标偏移到文件头
    lseek(fd,0,SEEK_SET);
    for(int i=0;i<=size;i++)
    {
        //上锁
        pthread_mutex_lock(&mutex);
        if(flag!=0)  // 不是当前线程要访问的时机
        {
            //解开互斥锁,并设置一个唤醒条件
            //等待被唤醒
            pthread_cond_wait(&cond,&mutex);
            //当被唤醒后,会立即尝试上锁
            //上锁成功,则完全被唤醒,从当前位置继续往后执行
            //上锁失败,重新回到cond上继续休眠,等待下一次唤醒
        }
        ///临界区//
        res=read(fd,&c,1);
        /临界区
        flag=1; //修改访问时机
        //通过指定的条件变量唤醒对方方程
        pthread_cond_signal(&cond);
        //只要唤醒了,对方线程肯定能上锁成功
        //解锁
        pthread_mutex_unlock(&mutex);
    }
    
    close(fd);
    pthread_exit(NULL);
}
void* callBack2(void* arg)
{
    while(1)
    {
        //上锁
        pthread_mutex_lock(&mutex);
        if(flag!=1)  //不是当前线程要访问的时机
        {
            //解开互斥锁,并设置一个唤醒条件
            //等待被唤醒
            pthread_cond_wait(&cond,&mutex);
            //当被唤醒后,会立即尝试上锁
            //上锁成功,则完全被唤醒,从当前位置继续往后执行
            //上锁失败,重新回到cond上继续休眠,等待下一次唤醒
        }
        //临界区/
        if(res==0)
        {
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);

            break;
        }
        printf("%c",c);
        /临界区///
        flag=0;  //修改访问时机
        //通过指定条件变量唤醒对方线程
        pthread_cond_signal(&cond);
        //解锁
        pthread_mutex_unlock(&mutex);

    }
    pthread_exit(NULL);
}


int main(int argc, const char *argv[])
{
    //创建并初始化一个互斥锁
    //pthread_mutex_init(&mutex,NULL);
    //创建条件变量
    //pthread_cond_init(&cond,NULL);
    pthread_t tid1,tid2;
    if(pthread_create(&tid1,NULL,callBack1,NULL)!=0)
    {
        fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
        return -1;
    }
    if(pthread_create(&tid2,NULL,callBack2,NULL)!=0)
    {
        fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
        return -1;
    }
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    //销毁互斥锁
    pthread_mutex_destroy(&mutex);
    //销毁条件变量
    pthread_cond_destroy(&cond);

    return 0;
}
3->

#include<myhead.h>

pthread_t tid1,tid2,tid3;
//临界资源
char buf=0;
//互斥锁
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
//创建条件变量
pthread_cond_t cond1=PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2=PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3=PTHREAD_COND_INITIALIZER;
int flag=1;
void* A(void* arg)
{
    while(1)
    {
        //上锁
        pthread_mutex_lock(&mutex);
        if(flag !=1)   //不是当前线程要访问的时机
        {
            //解开互斥锁,并设置一个唤醒条件
            //等待被唤醒
            pthread_cond_wait(&cond1,&mutex);
            //当被唤醒后,会立即尝试上锁
            //上锁成功,则完全被唤醒,从当前位置继续往后执行官
            //上锁失败,重新回到cond上继续休眠,等待下一次唤醒
        }
        //临界区//
        printf("A");
        //临界区/
        flag=2;//修改访问时机
        //通过指定的条件变量唤醒对方线程 
        pthread_cond_signal(&cond2);
        //只要唤醒,对方线程肯定能上锁成功
        pthread_cond_signal(&cond2);
        //只要唤醒,对方线程肯定能上锁成功
        pthread_cond_signal(&cond2);
        //只要唤醒,对方线程肯定能上锁成功

        //解锁
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}
void* B(void* arg)
{
    while(1)
    {
        //上锁
        pthread_mutex_lock(&mutex);
        if(flag!=2)//不是当前线程要访问的时机
        {
            //解开互斥锁,并设置一个唤醒条件
            //等待被唤醒
            pthread_cond_wait(&cond2,&mutex);
            //上锁成功,则完全被唤醒,从当前位置继续往后执行官
            //上锁失败,重新回到cond上继续休眠,等待下一次唤醒
        }
        //临界区//
        printf("B");
        //临界区///
        flag=3;//修改访问时机
        //通过指定的条件变量唤醒对方线程
        pthread_cond_signal(&cond3);

        //解锁
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}
void* C(void* arg)
{
    while(1)
    {
        //上锁
        pthread_mutex_lock(&mutex);
        if(flag!=3)//不是当前线程要访问的时机
        {
            //解开互斥锁,并设置一个唤醒条件
            //等待被唤醒
            pthread_cond_wait(&cond3,&mutex);
            //上锁成功,则完全被唤醒,从当前位置继续往后执行官
            //上锁失败,重新回到cond上继续休眠,等待下一次唤醒
        }
        //临界区//
        printf("C");
        //临界区///
        flag=1;//修改访问时机
        //通过指定的条件变量唤醒对方线程
        pthread_cond_signal(&cond1);

        //解锁
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
    if(pthread_create(&tid1,NULL,A,NULL)!=0)
    {
        fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
        return -1;
    }
    if(pthread_create(&tid2,NULL,B,NULL)!=0)
    {
        fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
        return -1;
    }
    if(pthread_create(&tid3,NULL,C,NULL)!=0)
    {
        fprintf(stderr,"pthread_create failed __%d__\n",__LINE__);
        return -1;
    }
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    //销毁互斥锁
    pthread_mutex_destroy(&mutex);
    //销毁条件变量
    pthread_cond_destroy(&cond1);
    pthread_cond_destroy(&cond2);
    pthread_cond_destroy(&cond3);
    return 0;
}
 

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

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

相关文章

Python爬虫:获取必应图片的下载链接

文章目录 1. 前言2. 实现思路3. 运行结果 1. 前言 首先&#xff0c;说明一下&#xff0c;本篇博客内容可能涉及到版权问题&#xff0c;为此&#xff0c;小编只说明一下实现思路&#xff0c;至于全部参考代码&#xff0c;小编不粘贴出来。不过&#xff0c;小编会说明详细一些&a…

Mybatis系列之核心分析

文章目录 一、Mybatis的前世1、简述&#xff1a;2、什么是JDBC&#xff1a;3、什么是驱动&#xff1a;4、JDBC的开发步骤&#xff1a;《1》注册和加载数据库驱动《2》获得数据库连接《3》获得语句执行对象&#xff0c;然后执行SQL语句&#xff0c;获取执行结果&#xff0c;最后…

问道管理:机器人产业迎催化 黄金价格或将突破前高

昨日&#xff0c;沪指盘中震动下探&#xff0c;一度跌近1%逼近3100点&#xff0c;尾盘逐步止跌&#xff1b;深成指、创业板指均跌超1%。截至收盘&#xff0c;沪指跌0.45%报3123.07点&#xff0c;深成指跌1.14%报10255.87点&#xff0c;创业板指跌1.14%报2027.73点&#xff0c;科…

SpringBoot2.0(mybatis-plus初始使用)

目录 一&#xff0c;介绍二&#xff0c;SpringBoot2.x整合MybatisPlus Lombok2.1&#xff0c;添加依赖 pom2.2&#xff0c;配置数据库信息 application.properties2.3&#xff0c;工程结构初始化 三&#xff0c;创建接口返回统一对象四&#xff0c;创建bean五&#xff0c;创建…

iTOP-STM32MP157开发板Ubuntu镜像的烧写

由于 Ubuntu 镜像的烧写和之前的 QT 系统存在区别,QT 系统所使用的内核可以不用区分屏幕&#xff0c;而ubuntu 系统不同。所以我们在烧写镜像的时候需要修改对应的内核镜像&#xff0c;我们以烧写 ubuntu18 无桌面版本的镜像为例&#xff0c;镜像存放路径为“iTOP-STM32MP157 开…

Windows10/11强制删除多余的本地连接、以太网

如图进入到网络适配器准备删除多余的网络&#xff0c;发现无法删除&#xff0c;删除按钮是被禁用的。 解决办法 此电脑》右键》管理 找到对应连接下面的名称 设备管理器》网络适配器》Hyper-V Virtual Ethernet Adapter>右键》卸载设备 谨慎操作&#xff0c;卸载错的话…

基于视觉重定位的室内AR导航APP的大创项目思路(2):改进的项目思路——建图和定位分离

文章目录 一、建图二、定位首先是第一种方法&#xff1a;几何方法其次是第二种方法&#xff1a;图像检索方法最后是第三种方法&#xff1a;深度学习方法 前情提要&#xff1a; 是第一次做项目的小白&#xff0c;文章内的资料介绍如有错误&#xff0c;请多包含&#xff01; 一、…

递归学习——记忆化搜索

目录 ​编辑 一&#xff0c;概念和效果 二&#xff0c;题目 1.斐波那契数 1.题目 2.题目接口 3.解题思路 2.不同的路径 1.题目 2.题目接口 3.解题思路 3.最长增长子序列 1.题目 2.题目接口 3.解题思路 4.猜数字游戏II 1.题目 2.题目接口 3.解题思路 总结&a…

2.docker基础使用命令

请点击滑动滚轮&#xff1a;放大查看 PS:发现滚轮不能放大了&#xff0c;这傻B的csdn&#xff0c;越做越垃圾了。。。 来这个地址看吧&#xff1a;https://img-blog.csdnimg.cn/7a5eb5a1eca4484fa0faa73b398257bd.png&#xff0c;滑动滚轮放大 ​ 源文件&#xff1a; 点击下载…

快速幂 c++

一般大家写都是 int ans 1; for (int i 1; i < a; i )ans * x;时间复杂度 但是这对于我们还不够&#xff0c;我们要 首先我们得知道一个数学知识 那么求 就有以下递归式 a 能被2整除 a 不能被2整除 (这里a/2是整除) 所以每次都调用 不就是么 最后补充一个东西…

【Java从入门到精通】这也许就是Java火热的原因吧!

前言&#xff1a;Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类&#xff1a;JavaSE&#xff08;Standard Edition&#xff0c;标准版&#xff09;&#xff1a;支持面向桌面、嵌入式和移动设备的应用程序开发&#xff1b;JavaEE&…

Apollo介绍和入门

文章目录 Apollo介绍配置中心介绍apollo介绍主流配置中心功能特性对比 Apollo简介 入门简单的执行流程Apollo具体的执行流程Apollo对象执行流程分步执行流程 核心概念应用&#xff0c;环境&#xff0c;集群&#xff0c;命名空间企业部署方案灰度发布全量发布 配置发布的原理发送…

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发&#xff0c;MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…

无涯教程-JavaScript - ISODD函数

描述 如果数字为奇数,则ISODD函数返回TRUE,如果数字为偶数,则返回FALSE。 语法 ISODD (number) 争论 Argument描述Required/OptionalNumber 要测试的值或表达式。 如果number不是整数,则将其截断。 Required Notes 您可以在执行计算之前使用此功能测试单元格的内容。 如果…

微服务 第一章 Java线程池技术应用

系列文章目录 第一章 Java线程池技术应用 文章目录 系列文章目录[TOC](文章目录) 前言1、Java创建线程方式回顾1.1、继承Thread类(只运行一次)1.1.1、改造成主线程常驻&#xff0c;每秒开启新线程运行1.1.2、匿名内部类1.1.3、缺点1.1.4、扩展知识&#xff1a;Java内部类1.1.4…

Python 内置函数详解 (2) 逻辑运算

近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客https://blog.csdn.net/boysoft2002/article/detai…

SOLIDWORKS PDM—数据库的备份计划

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

Linux——进程间通信(管道及共享内存)

目录 0. 前言 1. 进程通信的目的 2. 进程通信发展及分类 3. 进程通信匿名管道 3.1 什么是管道&#xff1f; 3.2 匿名管道系统调用 3.3 fork后子进程继承&#xff08;基于内存级&#xff09; 3.4 站在文件描述符角度-深度理解管道 3.5 站在内核角度-管道本质 3.6 父子…

电动车彻底取代燃油车?瑞士限制,中国每天烧7辆,现实不乐观

随着新能源汽车在国内汽车市场的销量占比突破三成&#xff0c;业界对于电动汽车取代燃油车相当乐观&#xff0c;然而电动汽车存在的不少问题却不容忽视&#xff0c;这正逐渐成为电动汽车普及的巨大障碍。 电动汽车如今面临的问题不少&#xff0c;最让消费者吐槽的是充电问题&am…

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…