学习笔记(linux高级编程)9

void pthread_cleanup_push(void (*routine)(void *), void *arg);

    功能:注册一个线程清理函数

    参数,routine,线程清理函数的入口

         arg,清理函数的参数。

    返回值,无

void pthread_cleanup_pop(int execute);

    功能:调用清理函数

    execute,非0  执行清理函数

             0 ,不执行清理

            

    返回值,无

这两个成对使用


线程控制:互斥与同步

    概念:

    互斥 ===》在多线程中对临界资源的排他性访问。

    互斥机制 ===》互斥锁  ===》保证临界资源的访问控制。

pthread_mutex_t   mutex;

    互斥锁类型        互斥锁变量 内核对象

    框架:

     定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁

         ****                      ***      ***

     1、定义:

         pthread_mutex_t   mutex;

     2、初始化锁

         int pthread_mutex_init(

             pthread_mutex_t *mutex,

             const pthread_mutexattr_t *attr);

         功能:将已经定义好的互斥锁初始化。

         参数:mutex 要初始化的互斥锁

               atrr  初始化的值,一般是NULL表示默认锁

         返回值:成功 0

                  失败 非零

3、加锁:

         int pthread_mutex_lock(pthread_mutex_t *mutex);

         功能:用指定的互斥锁开始加锁代码

               加锁后的代码到解锁部分的代码属于原子操作,

               在加锁期间其他进程/线程都不能操作该部分代码

               如果该函数在执行的时候,mutex已经被其他部分

               使用则代码阻塞。

         参数: mutex 用来给代码加锁的互斥锁

         返回值:成功 0

                  失败 非零

     4、解锁

         int pthread_mutex_unlock(pthread_mutex_t *mutex);

         功能:将指定的互斥锁解锁。

               解锁之后代码不再排他访问,一般加锁解锁同时出现。

         参数:用来解锁的互斥锁

         返回值:成功 0

                  失败 非零

5、销毁

          int pthread_mutex_destroy(pthread_mutex_t *mutex);

          功能:使用互斥锁完毕后需要销毁互斥锁

          参数:mutex 要销毁的互斥锁

          返回值:成功  0

                   失败  非零

6、trylock

         int pthread_mutex_trylock(pthread_mutex_t *mutex);

         功能:类似加锁函数效果,唯一区别就是不阻塞。

         参数:mutex 用来加锁的互斥锁

         返回值:成功 0

                  失败 非零

                  E_AGAIN

线程的同步 ===》同步 ===》有一定先后顺序的对资源的排他性访问。

    原因:互斥锁可以控制排他访问但没有次序。

    linux下的线程同步  ===》信号量机制 ===》semaphore.h   posix

    sem_open();

    信号量的分类:

    1、无名信号量 ==》线程间通信

    2、有名信号量 ==》进程间通信

框架:

    信号量的定义 ===》信号量的初始化 ==》信号量的PV操作===》信号量的销毁。

阻塞

               1 表示绿灯,进程可以通过执行

         返回值:成功  0

                  失败  -1;

    3、信号量的PV 操作

       P ===》申请资源===》申请一个二值信号量

       V ===》释放资源===》释放一个二值信号量

       P操作对应函数 ==》sem_wait();

       V操作对应函数 ==》sem_post();

    int sem_wait(sem_t *sem);

    功能:判断当前sem信号量是否有资源可用。

           如果sem有资源(==1),则申请该资源,程序继续运行

           如果sem没有资源(==0),则线程阻塞等待,一旦有资源

           则自动申请资源并继续运行程序。

           注意:sem 申请资源后会自动执行 sem = sem - 1;

    参数:sem 要判断的信号量资源

    返回值:成功 0

             失败 -1

    int sem_post(sem_t *sem);

    功能:函数可以将指定的sem信号量资源释放

           并默认执行,sem = sem+1;

           线程在该函数上不会阻塞。

    参数:sem 要释放资源的信号量

    返回值:成功 0

             失败 -1;

    4、信号量的销毁

       int sem_destroy(sem_t *sem);

       功能:使用完毕将指定的信号量销毁

       参数:sem要销毁的信号量

       返回值:成功 0

                  失败  -1;

互斥锁和信号量区别:

用的地方:    唯一性互斥访问,    不同线程顺序

个数:        1个锁,             多个锁

上锁解锁对象:同一个线程,        处理顺序用不同锁

产生死锁的主要原因:

(1) 因为系统资源不足。

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则

就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞,得到的对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。(高优先级运行,低优先级拿到锁没释放不运行)

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

Linux 里Sudo reboot重启 在配置bash后

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

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

相关文章

Perl语言入门指南

一、绪论 1.1 Perl语言概述 1.2 Perl的特色 1.3 Perl面临的问题 1.4 Perl语言的应用领域 二、Perl语言基础 2.1 Perl语言的历史发展 2.2 Perl语言的基本语法 2.3 Perl语言的数据类型 三、Perl语言控制结构 3.1 条件语句 3.2 循环结构 3.3 函数和子程序 四、Perl语…

OpenStack开源虚拟化平台(一)

目录 一、OpenStack背景介绍(一)OpenStack是什么(二)OpenStack的主要服务 二、计算服务Nova(一)Nova组件介绍(二)Libvirt简介(三)Nova中的RabbitMQ解析 OpenS…

MySQL-数据操作类型的角度理解 S锁 X锁

文章目录 1、S锁和S锁互相兼容2、S锁和X锁互斥3、X锁和X锁也互斥4、X锁和S锁也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S锁和S锁互相兼容 2、S锁和X锁互斥 3、X锁和X锁也互…

20240702 每日AI必读资讯

🔍GPTPdf:使用类似GPT-4o的多模态LLM分析PDF文件 - 使用类似 GPT-4o 多模态模型解析 PDF 文件,转换为 Markdown 格式。 - 代码简洁高效,仅293行。 - 解析结果几乎完美包括排版、数学公式、表格、图片、图表等内容。 &#x1…

【记录】IDEA2023的激活与安装

前言: 记录IDEA2023的激活与安装 第一步:官网下载安装包: 下载地址:https://www.jetbrains.com/idea/download/other.html 这个最好选择2023版本,用着很nice。 安装步骤就不详解了,无脑下一步就可以了…

VLAN原理与配置

AUTHOR :闫小雨 DATE:2024-04-28 目录 VLAN的三种端口类型 VLAN原理 什么是VLAN 为什么使用VLAN VLAN的基本原理 VLAN标签 VLAN标签各字段含义如下: VLAN的划分方式 VLAN的划分包括如下5种方法: VLAN的接口链路类型 创建V…

便签 Pro(Mac 智能便签工具)专业版怎么样,值得购买吗?

使用 Mac 的小伙伴平时都是怎么记录工作生活中的碎片信息?用聊天软件,还是系统备忘录呢? 实际体验下来,其实都难以称得上好用。 赶紧来了解一下 Mac 多彩思维速记工具便签 Pro!拥有智能边框大小、iCloud 同步、历史记…

矩阵置零解题

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…

VUE3解决跨域问题

本文基于vue3 vite element-plus pnpm 报错:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接访问其他IP,需要用vite.config.ts &#xff0…

API-本地存储

学习目标: 掌握本地存储 学习内容: 本地存储介绍本地存储分类存储复杂数据类型 本地存储介绍: 以前我们页面写的数据一刷新页面就没有了,是不是? 随着互联网的快速发展,基于网页的应用越来越普遍,同时也…

算法基础入门 - 2.栈、队列、链表

文章目录 算法基础入门第二章 栈、队列、链表2.1 队列2.2 栈2.3 纸牌游戏2.4 链表如何建立链表?1.我们需要一个头指针(head)指向链表的初始。链表还没建立时头指针head为空2.建立第一个结点3.设置刚创建的这个结点的数据域(左半)和指针域(右半)4.设置头指针,头指针可方便…

问题-小技巧-专业版Win11怎么启动电脑的休眠模式?

专业版Win11怎么启动电脑的休眠模式? powercfg -a powercfg -hibernate on 启用管理员面板依次输入上述命令就可以了。

宠物医院管理系统-计算机毕业设计源码07221

目 录 1 绪论 1.1 选题背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 宠物医院管理系统系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分…

AI智能在Type-C领域的应用

随着科技的飞速发展,Type-C接口凭借其卓越的性能和广泛的应用场景,已成为现代电子设备中不可或缺的一部分。而AI智能技术的兴起,为Type-C领域带来了革命性的变革,推动了其功能的进一步完善和应用领域的拓展。本文将探讨AI智能在Ty…

中文翻译老挝语只推荐一个神器《老挝语翻译通》App,老挝语口语发音练习,支持老挝文OCR识别提取文字!

出国旅游去探索东南亚的神秘国家:老挝,不会老挝语怎么办?不用怕,下载《老挝语翻译通》App帮助你把中文翻译成老挝语。 功能亮点: 实时翻译:实时把中文翻译成老挝语,老挝语单词或者句子均可均可…

typescript学习回顾(三)

今天继续来分享ts的相关概念,枚举,ts模块化,接口和类型兼容性 ts的扩展类型:类型别名,枚举,接口和类 枚举 基础概念 枚举通常用于约束某个变量的取值范围。当然字面量和联合类型配合使用,也可…

Linux 高级编程——线程控制

线程控制:互斥与同步 概念: 互斥 》在多线程中对临界资源的排他性访问。 互斥机制 》互斥锁 》保证临界资源的 访问控制。 pthread_mutex_t mutex; 互斥锁类型 互斥锁变量 内核对象 框架: 定义互斥锁 》初始化锁 》加…

前端——在本地搭建Vue单页应用

目录 1、安装最新node.js 2、打开命令行窗口 3、进入要保存项目的目录下 4、安装 Vue CLI 5、创建新项目,选择功能 5.1 新建项目 5.2 Please pick a preset 5.3 Check the features needed for your project 5.4 Choose a version of Vue.js 5.5 Use hist…

优化数据库字段使用位运算-php语言示例

背景:一个会员有三个状态,A、B、C,其中一个人可以为 A、B、C、AB;之前数据表结构加了三个字段is_a、is_b、is_c; 本人实在不想这样粗糙的实现需求,遂决定用位运算优化。 上代码: 位运算可以用来处理状态值…

探索SOLIDWORKS 2024设计增强功能

随着技术的不断进步和市场的日益竞争,工程设计和制造行业对于快捷、准确和创新的工具需求日益增长。SOLIDWORKS作为3D CAD设计软件,一直致力于为用户提供更强大、更便捷的设计工具。SOLIDWORKS 2024的发布,再次证明了其在设计增强功能方面的持…