Linux 三十六章
🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
信号量
sem_init
sem_destroy
sem_wait
sem_post
基于环形队列的CP问题
环形队列的生产者消费者模型
线程池
localtime时间戳转化
mkdir系统调用
bind绑定成员函数
懒汉饿汉单例模式
懒汉模式:
饿汉模式:
懒汉和饿汉相同点:
线程池源码实现
信号量
1)信号量本质就是一把计数器
2)申请信号量本质就是预订资源
3)PV操作是原子的
PV操作是信号量的基本操作,用于对信号量的值进行增加(V操作)和减少(P操作)
快速认识信号量的接口
头文件:#include<semaphore.h>
sem_init
在Linux中,sem_init 函数用于初始化一个未命名的信号量。
其函数声明如下:
int sem_init(sem_t *sem, int pshared, unsigned int value); * sem:指向要初始化的信号量的指针。 * pshared:指定信号量是在进程间共享(非0)还是在当前进程内共享(0)。 * value:指定信号量的初始值。
sem_destroy
sem_destroy 函数用于销毁一个未命名的信号量。
其函数声明如下:
int sem_destroy(sem_t *sem);
sem_wait
在Linux中,sem_wait 函数用于执行一个P操作,即等待(wait)信号量的值减少。
其函数声明如下:
int sem_wait(sem_t *sem); * sem:指向要操作的信号量的指针。 当调用 sem_wait 函数时,它会尝试减少信号量的值。如果信号量的值大于0, 则将其减少;如果信号量的值已经为0,则该操作将被阻塞,直到信号量的值不为0。 一旦成功执行了P操作,即信号量的值被减少,进程或线程可以继续执行接下来的代码段。
sem_post
在Linux中,sem_post 函数用于执行一个V操作,即增加(post)信号量的值。
其函数声明如下:
int sem_post(sem_t *sem); * sem:指向要操作的信号量的指针。 当调用 sem_post 函数时,它会增加信号量的值。这通常用于释放资源或信号其他进程或线程可以继续执行。 如果有其他进程或线程正在等待该信号量(通过 sem_wait 阻塞),则调用 sem_post 后会使其中一个等 待的进程或线程继续执行。
基于环形队列的CP问题
1.生产者不能把消费者套圈
2.消费者不能超过生产者
生产者和消费者只有两种场景指向同一个位置
1)为空:只能让生产者跑(互斥)
2)未满:只能让消费者跑(互斥)
其他情况,生产者和消费者不会指向同一个位置(同步)
伪代码
资源分为空间和数据
需要两个信号量 Sem_space Sem_data生产者: {P(sem_space)//生产行为V(sem_data) }生产者: {P(sem_data)//生产行为V(sem_space) }
多生产者和多消费者
为了保证临界资源的安全性,我们需要通过加锁实现生产者之间的互斥
现在就有一个问题?
我们线程是先申请资源还是,先申请信号量呢?
答案是,先申请信号量,因为我们可以让多个生产者先申请信号量,然后阻塞在加锁哪里,这样就可以节省申请信号量的时间
环形队列的生产者消费者模型
线程池
localtime时间戳转化
在 Linux 中,localtime 函数是用于将时间戳(自 1970 年 1 月 1 日以来的秒数)转换为本地时间的函数。
它的函数原型通常在 time.h 头文件中声明
struct tm *localtime(const time_t *timep); 这个函数接受一个 time_t 类型的指针作为参数,返回一个指向 tm 结构体的指针, 该结构体包含了年、月、日、时、分、秒等本地时间信息。
mkdir系统调用
在Linux中,mkdir是一个系统调用,用于创建新的目录。系统调用是操作系统提供给应用程序的接口,允许应用程序直接请求操作系统执行某些特定的操作。
mkdir系统调用的原型如下:
#include <sys/stat.h> #include <sys/types.h>int mkdir(const char *pathname, mode_t mode); pathname:要创建的目录的路径名。 mode:新目录的权限模式。可以使用chmod符号或八进制表示(例如0755),用于指定新目录的权限。 通常情况下,新目录默认权限为0777,但会受到umask设置的影响。
以下是一个简单的C语言示例,展示了如何使用mkdir系统调用来创建新的目录:
#include <sys/stat.h> #include <sys/types.h> #include <stdio.h> int main() {const char* dir = "/path/to/new/dir";mode_t mode = 0777;int result = mkdir(dir, mode);if (result == 0) {printf("Directory created successfully.\n");} else {perror("Error creating directory");}return 0; } 请注意,为了使用mkdir系统调用,你需要包含sys/types.h和sys/stat.h头文件,并链接libc库( 使用gcc时会自动链接)。
bind绑定成员函数
bind () 函数 std::bind()函数作为函数的适配器,它可以扩大函数是使用场合,使得函数更加灵活的被使用。 template<class F, class… Args> bind(F&&f, Args&&… args); 参数: f 可以是function object,函数指针,函数引用,成员函数指针,或者数据成员的指针,lambda表达式。 返回值:function object事例 #include <iostream> #include <functional>using namespace std; using namespace std::placeholders;class test_callback { public:test_callback(void):a(10),b(100){ }typedef function<void(int,int)> callback;void use_value(callback func) {cout << "value a is " << a << endl;cout << "value b is " << b << endl;func(a, b);} private:int a;int b; };class client { public:client(){ this->value = 2; }static void print_sum(int a, int b, int c) {cout << a + b +c << endl;}void print_multiply(int a, int b, int c, int d) {cout << a * b * c * d << endl;cout << "client value is " << this->value << endl; } private:int value; };int main(int argc, char *argv[]) {test_callback test1;client client1;test1.use_value(bind(client::print_sum, _2, _1, 0));test1.use_value(bind(&client::print_multiply, &client1, _1, _2, 2, 3));return 0; } 重点是在使用non static function时要加&获取nonstatic 成员函数地址 结果: value a is 10 value b is 100 110 value a is 10 value b is 100 6000 client value is 2
懒汉饿汉单例模式
C++中的单例模式、懒汉模式和饿汉模式。单例模式在面试和实际开发中都非常重要,其构造函数和instance成员变量分别采用private和static修饰,通过get_instance函数获取单例对象。懒汉模式存在线程安全问题,可通过添加锁解决。饿汉模式则是懒汉模式的一种优化,通过提前加载instance避免线程安全问题。
饿汉模式:程序运行即创建对象并实例化,静态实现所以线程是安全的懒汉模式:创建对象不实例化,需要的时候才实例化,线程不安全需要(加锁)
懒汉模式:
1)构造函数设为私有
2)instance//单例为静态成员变量,类内声明,类外初始化static 类名* instance
类名* 类名::instance=nullptr;//类外定义
3)创建对外接口,通过这个获取单例Static 类名* getinstance() {//这里为什么要用俩个if呢?因为我们在内层if进行加锁了,加锁为了保证只有一个线程去创建单例。其实可以把锁加在外层if,但是这样会导致每个线程都会去申请锁,这样导致资源浪费,所以我们把锁加在内层的if,只要有一个线程创建了单例,那其他线程就不会进入到内层ifif(instance==nullptr){//这里可以加一把锁if(instance==nullptr){instance=new 类名();}//解锁}return instance; }
饿汉模式:1)构造函数设为私有
2)instance//单例为静态成员变量,类内声明,类外初始化static 类名* instance
类名* 类名::instance=new 类名();//类外定义
3)创建对外接口,通过这个获取单例Static 类名* getinstance() {return instance; }
懒汉和饿汉相同点:
1)都需要将构造函数设置为私有的
2)都需要静态的类类型指针变量
懒汉和饿汉不同点:
懒汉你要使用的时候才创建单例(多线程中,是线程不安全的,可以通过加锁实现安全)
饿汉是使用之前就创建单例(多线程中,是线程安全的)使用懒汉单例模式的原因
懒汉单例模式的主要作用是在第一次使用类时才创建类的实例,从而节省资源。在某些情况下,类的实例在程序运行期间只需要创建一次,如果提前创建,可能会浪费资源。懒汉单例模式就是在这种情况下使用的。例如,线程池类在程序运行期间只需要创建一次,如果提前创建,可能会导致线程在等待任务时提前创建线程,从而浪费资源。使用懒汉单例模式,可以在第一次使用线程池时才创建线程池实例,从而避免这种情况。总结来说,懒汉单例模式的主要作用是在第一次使用类时才创建类的实例,从而节省资源。
线程池源码实现
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸
相关文章:
Linux 三十六章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要…...
ntsd用法+安装包
ntsd是一个强大的进程终止软件,除了少数系统进程之外一律杀掉 用法 1.ntsd -c q -p 进程的pid 2.ntsd -c q -pn 进程名 记得解压到System32里面 当然,资源管理器的进程是可以杀的所以也可以让电脑黑屏 同样可以让电脑黑屏的还有taskkill /f /im 进程…...

Nacos 微服务管理
Nacos 本教程将为您提供Nacos的基本介绍,并带您完成Nacos的安装、服务注册与发现、配置管理等功能。在这个过程中,您将学到如何使用Nacos进行微服务管理。下方是官方文档: Nacos官方文档 1. Nacos 简介 Nacos(Naming and Confi…...

Kubernetes集群上的Etcd备份和恢复
在本教程中,您将学习如何在Kubernetes集群上使用etcd快照进行etcd备份和恢复。 在Kubernetes架构中,etcd是集群的重要组成部分。所有集群对象及其状态都存储在etcd中。为了更好地理解Kubernetes,有几点关于etcd的信息是您需要了解的。 它是…...
创建型模式 (Python版)
单例模式 懒汉式 class SingleTon:# 类属性_obj None # 用来存储对象# 创造对象def __new__(cls, *args, **kwargs):# 如果对象不存在,就创造一个对象if cls._obj is None:cls._obj super().__new__(cls, *args, *kwargs)# 返回对象return cls._objif __name__…...
【收录 Hello 算法】9.4 小结
目录 9.4 小结 1. 重点回顾 2. Q & A 9.4 小结 1. 重点回顾 图由顶点和边组成,可以表示为一组顶点和一组边构成的集合。相较于线性关系(链表)和分治关系(树),网络关系(图&am…...
MYSQL数据库基础语法
目录 友情提醒第一章:数据库简述1)数据库简述2)常见的数据库软件3)MySQL数据库安装和连接4)SQL语句分类①DDL(Data Definition)②DML(Data Manipulation)③DQL࿰…...
R实验 参数检验(二)
实验目的:掌握正态分布和二项分布中,功效与样本容量之间的关系;学会利用R软件完成一个正态总体方差和两个正态总体方差比的区间估计和检验。 实验内容: (习题5.28)一种药物可治疗眼内高压,目的…...

【Linux】进程信号及相关函数/系统调用的简单认识与使用
文章目录 前言一、相关函数/系统调用1. signal2. kill3. abort (库函数)4. raise (库函数)5. alarm 前言 现实生活中, 存在着诸多信号, 比如红绿灯, 上下课铃声…我们在接收到信号时, 就会做出相应的动作. 对于进程也是如此的, 进程也会收到来自 OS 发出的信号, 根据信号的不同…...
Spring (14)什么是Spring Boot
Spring Boot是一个开源的Java基础框架,旨在简化Spring应用的创建和开发过程。Spring Boot通过提供一套默认配置(convention over configuration),自动配置和启动器(starters)来减少开发者的开发工作量和配置…...

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测
区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…...
Java集合框架全景解读:从源码到实践精通指南
1. Java集合框架简介 在Java中,集合框架是用于存储和处理数据集合的一组类和接口。它提供了一系列的数据结构,比如列表(List)、集(Set)和映射(Map)。这些数据结构为开发者处理数据提…...

Python | Leetcode Python题解之第107题二叉树的层序遍历II
题目: 题解: class Solution:def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:levelOrder list()if not root:return levelOrderq collections.deque([root])while q:level list()size len(q)for _ in range(size):node q.popl…...

H4vdo 台湾APT-27视频投放工具
地址:https://github.com/MartinxMax/H4vdo 视频 关于 H4vdo RTMP lock 屏播放视频工具,可以向目标发送有效载荷,播放目标的屏幕内容。目标无法曹作计算机 使用方法 安装依赖 根据你的操作系统选择一个安装程序 RTMP 服务端 ./rtsp-simple-server.…...

数据结构(树)
1.树的概念和结构 树,顾名思义,它看起来像一棵树,是由n个结点组成的非线性的数据结构。 下面就是一颗树: 树的一些基本概念: 结点的度:一个结点含有的子树的个数称为该结点的度; 如上图&#…...

HTML静态网页成品作业(HTML+CSS)——川西旅游介绍网页(2个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有2个页面。 二、作品演示 三、代…...

MySQL数据库单表查询中查询条件的写法
1.使用比较运算符作为查询条件 ; !; >; >; <; <; 如上图所示,可以使用命令select 字段,字段 from 表名 where Gender “M”; 即挑选出Gender “M” 的教师, 如上图所示,可以使用命令select 字段,…...

SQL靶场搭建
概述 简单介绍一下SQL靶场的搭建,以及在搭建过程中遇到的一些问题。使用该软件搭建靶场相对简单,适合新手小白。当然,也可以在自己的虚拟机下进行搭建,相对来说就较为复杂。本章主要讲解使用Phpstudy进行SQL靶场搭建。 这里我推…...
Cocos Creator 帧动画播放组件制作详解
前言 Cocos Creator 是一个强大的游戏开发工具,提供了丰富的功能和组件,其中帧动画播放组件是游戏开发中常用的组件之一,通过帧动画播放组件可以实现角色动画、特效动画等效果。本文将详细介绍如何使用 Cocos Creator 制作帧动画播放组件&am…...
基于STM32控制的双轮自平衡小车的设计
基于STM32控制的双轮自平衡小车的设计是一项涉及电子、控制理论、机械设计和编程的综合工程。以下是关于该设计的一个概述,包括关键组件、控制策略和示例代码。 设计概述 1. 项目背景 自平衡小车作为一种智能控制系统,其设计和实现涉及到多个学科领域…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...