当前位置: 首页 > news >正文

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 三十六章

​​​​​​​ &#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要…...

ntsd用法+安装包

ntsd是一个强大的进程终止软件&#xff0c;除了少数系统进程之外一律杀掉 用法 1.ntsd -c q -p 进程的pid 2.ntsd -c q -pn 进程名 记得解压到System32里面 当然&#xff0c;资源管理器的进程是可以杀的所以也可以让电脑黑屏 同样可以让电脑黑屏的还有taskkill /f /im 进程…...

Nacos 微服务管理

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

Kubernetes集群上的Etcd备份和恢复

在本教程中&#xff0c;您将学习如何在Kubernetes集群上使用etcd快照进行etcd备份和恢复。 在Kubernetes架构中&#xff0c;etcd是集群的重要组成部分。所有集群对象及其状态都存储在etcd中。为了更好地理解Kubernetes&#xff0c;有几点关于etcd的信息是您需要了解的。 它是…...

创建型模式 (Python版)

单例模式 懒汉式 class SingleTon:# 类属性_obj None # 用来存储对象# 创造对象def __new__(cls, *args, **kwargs):# 如果对象不存在&#xff0c;就创造一个对象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. 重点回顾 图由顶点和边组成&#xff0c;可以表示为一组顶点和一组边构成的集合。相较于线性关系&#xff08;链表&#xff09;和分治关系&#xff08;树&#xff09;&#xff0c;网络关系&#xff08;图&am…...

MYSQL数据库基础语法

目录 友情提醒第一章&#xff1a;数据库简述1&#xff09;数据库简述2&#xff09;常见的数据库软件3&#xff09;MySQL数据库安装和连接4&#xff09;SQL语句分类①DDL&#xff08;Data Definition&#xff09;②DML&#xff08;Data Manipulation&#xff09;③DQL&#xff0…...

R实验 参数检验(二)

实验目的&#xff1a;掌握正态分布和二项分布中&#xff0c;功效与样本容量之间的关系&#xff1b;学会利用R软件完成一个正态总体方差和两个正态总体方差比的区间估计和检验。 实验内容&#xff1a; &#xff08;习题5.28&#xff09;一种药物可治疗眼内高压&#xff0c;目的…...

【Linux】进程信号及相关函数/系统调用的简单认识与使用

文章目录 前言一、相关函数/系统调用1. signal2. kill3. abort (库函数)4. raise (库函数)5. alarm 前言 现实生活中, 存在着诸多信号, 比如红绿灯, 上下课铃声…我们在接收到信号时, 就会做出相应的动作. 对于进程也是如此的, 进程也会收到来自 OS 发出的信号, 根据信号的不同…...

Spring (14)什么是Spring Boot

Spring Boot是一个开源的Java基础框架&#xff0c;旨在简化Spring应用的创建和开发过程。Spring Boot通过提供一套默认配置&#xff08;convention over configuration&#xff09;&#xff0c;自动配置和启动器&#xff08;starters&#xff09;来减少开发者的开发工作量和配置…...

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…...

Java集合框架全景解读:从源码到实践精通指南

1. Java集合框架简介 在Java中&#xff0c;集合框架是用于存储和处理数据集合的一组类和接口。它提供了一系列的数据结构&#xff0c;比如列表&#xff08;List&#xff09;、集&#xff08;Set&#xff09;和映射&#xff08;Map&#xff09;。这些数据结构为开发者处理数据提…...

Python | Leetcode Python题解之第107题二叉树的层序遍历II

题目&#xff1a; 题解&#xff1a; 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 屏播放视频工具&#xff0c;可以向目标发送有效载荷&#xff0c;播放目标的屏幕内容。目标无法曹作计算机 使用方法 安装依赖 根据你的操作系统选择一个安装程序 RTMP 服务端 ./rtsp-simple-server.…...

数据结构(树)

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

HTML静态网页成品作业(HTML+CSS)——川西旅游介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…...

MySQL数据库单表查询中查询条件的写法

1.使用比较运算符作为查询条件 ; !; >; >; <; <; 如上图所示&#xff0c;可以使用命令select 字段&#xff0c;字段 from 表名 where Gender “M”; 即挑选出Gender “M” 的教师&#xff0c; 如上图所示&#xff0c;可以使用命令select 字段&#xff0c;…...

SQL靶场搭建

概述 简单介绍一下SQL靶场的搭建&#xff0c;以及在搭建过程中遇到的一些问题。使用该软件搭建靶场相对简单&#xff0c;适合新手小白。当然&#xff0c;也可以在自己的虚拟机下进行搭建&#xff0c;相对来说就较为复杂。本章主要讲解使用Phpstudy进行SQL靶场搭建。 这里我推…...

Cocos Creator 帧动画播放组件制作详解

前言 Cocos Creator 是一个强大的游戏开发工具&#xff0c;提供了丰富的功能和组件&#xff0c;其中帧动画播放组件是游戏开发中常用的组件之一&#xff0c;通过帧动画播放组件可以实现角色动画、特效动画等效果。本文将详细介绍如何使用 Cocos Creator 制作帧动画播放组件&am…...

基于STM32控制的双轮自平衡小车的设计

基于STM32控制的双轮自平衡小车的设计是一项涉及电子、控制理论、机械设计和编程的综合工程。以下是关于该设计的一个概述&#xff0c;包括关键组件、控制策略和示例代码。 设计概述 1. 项目背景 自平衡小车作为一种智能控制系统&#xff0c;其设计和实现涉及到多个学科领域…...

如何快速搭建个人小说离线图书馆:fanqienovel-downloader完整使用指南

如何快速搭建个人小说离线图书馆&#xff1a;fanqienovel-downloader完整使用指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 厌倦了在线小说的网络限制和广告干扰&#xff1f;想要随时…...

【实战篇】OneWire时序精解:从复位脉冲到DS18B20温度读取

1. OneWire协议基础&#xff1a;单线通信的魔法 第一次接触OneWire&#xff08;单总线&#xff09;协议时&#xff0c;我盯着那根孤零零的信号线愣了半天——这根线既要供电又要传数据&#xff0c;还要协调多个设备&#xff0c;简直像用一根吸管同时喝奶茶、吃珍珠和传情书。但…...

如何在群晖NAS上部署百度网盘客户端:终极安装与配置指南

如何在群晖NAS上部署百度网盘客户端&#xff1a;终极安装与配置指南 【免费下载链接】synology-baiduNetdisk-package 项目地址: https://gitcode.com/gh_mirrors/sy/synology-baiduNetdisk-package 还在为群晖NAS与百度网盘之间的文件同步问题而烦恼吗&#xff1f;群晖…...

MATLAB Simulink代码生成全流程详解:涵盖环境配置、参数与信号配置、函数名配置、数...

matlab simulink代码生成 包括&#xff1a;环境配置&#xff0c;参数与信号配置&#xff0c;函数名配置&#xff0c;数据管理&#xff0c;代码生成&#xff0c;以及代码优化等 文档63页把Simulink模型变成可烧录的C代码&#xff0c;这事儿听起来挺玄乎&#xff0c;但只要你踩过…...

OpenPPL之二,优化器里面的算子融合

算子融合的执行时机 完整的时间线 模型加载阶段&#xff08;一次&#xff09; 运行时阶段&#xff08;多次推理&#xff09;↓ ↓ ┌─────────────────────┐ ┌─────────────┐ │ 1. 解析ON…...

OpenClaw负载均衡:多Qwen3-VL:30B实例轮询策略

OpenClaw负载均衡&#xff1a;多Qwen3-VL:30B实例轮询策略 1. 为什么需要多模型实例负载均衡 上周我遇到一个棘手问题&#xff1a;用OpenClaw处理批量图片分析任务时&#xff0c;单个Qwen3-VL:30B实例频繁触发速率限制&#xff0c;导致任务队列堆积。更糟的是&#xff0c;有次…...

HertzBeat与Prometheus兼容性详解:平滑迁移和生态整合终极指南

HertzBeat与Prometheus兼容性详解&#xff1a;平滑迁移和生态整合终极指南 Apache HertzBeat是一款功能强大的开源实时监控系统&#xff0c;与Prometheus生态系统完美兼容&#xff0c;提供无代理、高性能集群和自定义监控功能。&#x1f680; 作为新一代监控工具&#xff0c;H…...

Docker+iredmail搭建企业级邮件服务器全流程(附常见问题排查)

Dockeriredmail搭建企业级邮件服务器全流程指南 邮件系统作为企业日常沟通的核心基础设施&#xff0c;其稳定性和安全性直接影响业务运转效率。传统邮件服务器部署往往需要复杂的配置和漫长的调试周期&#xff0c;而Docker容器化技术结合iredmail开源邮件解决方案&#xff0c;为…...

计算机毕业设计springboot彝族民族文化宣传网站 基于SpringBoot的彝族非物质文化遗产数字化展示平台 SpringBoot框架下彝族传统风俗文化传播系统

计算机毕业设计springboot彝族民族文化宣传网站l36tn9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享 在当今数字化浪潮席卷全球的背景下&#xff0c;少数民族文化的保护与传承面临着前所未有…...

终极MangoHud配置文件备份工具:轻松打造图形化管理界面

终极MangoHud配置文件备份工具&#xff1a;轻松打造图形化管理界面 【免费下载链接】MangoHud A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more. Discord: https://discordapp.com/invite/Gj5YmBb 项目地址: https://gitcode.com/gh_m…...