首页 > 其他分享 >io 互斥

io 互斥

时间:2024-08-29 14:59:15浏览次数:10  
标签:lock 互斥 mutex io pthread NULL 资源

概念

互斥:多个线程在访问临界资源时,同一时间只能一个线程访问

临界资源:一次仅允许一个线所使用的资源

临界区:指的是一个访问共享资源的程序片段

互斥锁(mutex):通过互斥锁可以实现互斥机制,主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
pthread_mutex_t lock;

void *handler_swap(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&lock);  //上锁
        for (int i = 0; i < 5; i++)
        {
            int t = a[i];
            a[i] = a[9 - i];
            a[9 - i] = t;
        }
        pthread_mutex_unlock(&lock); //解锁
    }
    return NULL;
}

void *handler_print(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&lock); //上锁
        for (int i = 0; i < 10; i++)
            printf("%d ", a[i]);
        printf("\n");
        pthread_mutex_unlock(&lock); //解锁
        sleep(1); //锁里面减少耗时大的操作
    }
    return NULL;
}

int main(int argc, char const *argv[])
{
    pthread_t tid1, tid2;

    //初始化互斥锁
    if (pthread_mutex_init(&lock, NULL) != 0)
    {
        perror("lock err");
        return -1;
    }

    if (pthread_create(&tid1, NULL, handler_swap, NULL) != 0)
    {
        perror("err");
        return -1;
    }

    if (pthread_create(&tid2, NULL, handler_print, NULL) != 0)
    {
        perror("err");
        return -1;
    }

    pthread_join(tid1, NULL); //为了让整个进程不要结束
    pthread_join(tid2, NULL);

    return 0;
}

死锁产生的四个必要条件

1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

  1. 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  2. 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  3. 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

标签:lock,互斥,mutex,io,pthread,NULL,资源
From: https://blog.csdn.net/weixin_63207763/article/details/141679001

相关文章

  • iOS审核被拒Guideline 4.2 - Design - Minimum Functionality 被认为马甲包
    解决方案:UI风格修改,APP名字,代码混淆Hello,Thankyouforyourresubmission.Uponfurtherreview,weidentifiedanadditionalissuethatneedsyourattention.Seebelowformoreinformation.Ifyouhaveanyquestions,weareheretohelp.Replytothismessa......
  • Veeam Backup & Replication v12.2 发布,新增功能概述
    VeeamBackup&Replicationv12.2发布,新增功能概述VeeamDataPlatform|面向混合云和多云的备份和恢复监控和分析恢复编排请访问原文链接:https://sysin.org/blog/veeam-backup-12/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全球首屈一指的备份和恢复提......
  • 2D/3D建模软件Dn2022下载Adobe Dimension软件下载(全版本)
    AdobeDimension的主要版本历史如下(不带具体发布时间):1.DimensionCC2.DimensionCC20193.Dimension20204.Dimension20215.Dimension2022简要总结:AdobeDimension于2018年首次推出,作为CC2019的新增创作工具。发布至今,Dimension已迭代更新了4个主要版......
  • Alias Autostudio2023软件下载Alias2022软件下载安装包(全版本)
    AliasAutostudio是一款由Autodesk公司开发的概念设计和3D建模软件。它主要用于汽车、工业产品等概念设计阶段,具有以下核心功能:-快速造型-内置丰富的基本造型工具,可以快速生成设计概念构思。-灵活编辑-使用子分模型方式组织数据,支持多种方式编辑模型。-渲染与......
  • 【计算机组成原理】五、中央处理器:3.指令流水线(互斥、同步)
    5.指令流水线文章目录5.指令流水线5.1基本概念5.2性能指标5.3指令流水线影响因素5.3.1结构相关(**资源冲突**):**互斥**5.3.2==数据相关(**数据冲突**)==:**同步**5.3.3控制相关(**控制冲突**)5.4流水线分类5.5流水线的多发技术5.6==五段式流水线==对指令执行的优化5.......
  • 黑马JavaWeb开发笔记09——ElementUI代码引入教程、Element常用组件使用(Table, Pagina
    文章目录前言ElementUI1.快速入门(代码引入教程)2.组件:Table表格3.组件:Pagination分页4.组件:Dialog对话框5.组件:Form表单总结前言本篇文章是2023年最新黑马JavaWeb开发笔记09:ElementUI代码进入教程、常用组件使用的总结,帮助需要学习Web开发的朋友温故而知新。El......
  • 【深度补全最新综述】Deep Depth Completion from Extremely Sparse Data: A Survey
    【综述】从稀疏的数据中进行深度补全:DeepDepthCompletionfromExtremelySparseData:ASurvey从极度稀疏数据中完成深度的研究综述摘要1.引言贡献概述2.基于深度学习的深度补全2.1问题表述2.2分类方法3.无引导深度补全3.1稀疏感知CNN......
  • 基于.NET开源、免费的跨平台物联网网关:IoTGateway
    思维导航前言项目介绍项目源代码项目演示项目源码地址优秀项目和框架精选前言今天大姚给大家分享一个基于.NET开源、免费的跨平台物联网网关:IoTGateway。项目介绍IoTGateway是一个基于.NET6的跨平台物联网网关。通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、......
  • Clion\+OpenCV(C\+\+版)开发环境配置教程Win/Mac
    合集-环境配置(2)1.最全!嵌入式STM32单片机开发环境配置教学Win/Mac!!!08-282.最简最速!C++版OpenCV安装配置教程Win/Mac!!!08-28收起Clion+OpenCV(C++版)开发环境配置教程Win/Mac平时在学习和比赛的时候都是使用的Python版本的OpenCV,最近遇到了一个项目使用的上位机性能有限于是决定......
  • Opengl+GLFW+GLAD+Visual Studio 配置
        学习计算机图形学的朋友们基础到的第一个图形库因该就是Opengl,毕竟Opengl相对DirectX和Valuken要简单不少。但是Opengl这个库当中的函数到底应该如何调用,成了很多朋友们学习路上的拦路虎,再次笔者就交大家如何配置第三方库来调用Opengl当中的函数。1、下载Visual......