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)都需要静态的类类型指针变量
懒汉和饿汉不同点:
懒汉你要使用的时候才创建单例(多线程中,是线程不安全的,可以通过加锁实现安全)
饿汉是使用之前就创建单例(多线程中,是线程安全的)

使用懒汉单例模式的原因
懒汉单例模式的主要作用是在第一次使用类时才创建类的实例,从而节省资源。在某些情况下,类的实例在程序运行期间只需要创建一次,如果提前创建,可能会浪费资源。懒汉单例模式就是在这种情况下使用的。

例如,线程池类在程序运行期间只需要创建一次,如果提前创建,可能会导致线程在等待任务时提前创建线程,从而浪费资源。使用懒汉单例模式,可以在第一次使用线程池时才创建线程池实例,从而避免这种情况。总结来说,懒汉单例模式的主要作用是在第一次使用类时才创建类的实例,从而节省资源。

线程池源码实现

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸

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

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

相关文章

ORACLE 资源管理参数与等待事件resmgr:cpu quantum

RESOURCE_MANAGER_PLAN 先来看下参数的含义 官网链接&#xff1a;RESOURCE_MANAGER_PLAN (oracle.com) 意思翻译过来这个参数用于资源计划。后边的看完也不是很明白具体的作用 于是参考了以下文章 Oracle 参数 RESOURCE_MANAGER_PLAN 官方解释&#xff0c;作用&#xff0c;…

人从胚胎开始就要交税,直到死亡,是这样吗?

文章目录 梗概税收的基本概念从胚胎到死亡的税收分析胚胎到出生出生到成年成年到死亡 总结 梗概 人从胚胎阶段开始交税直到死亡&#xff0c;这个观点听起来有些戏剧化&#xff0c;但如果我们广义地理解“交税”这个概念&#xff0c;可以从不同的角度进行探讨。实际上&#xff…

ts中的class类

class Animal {constructor(public name: string) {}move(distance: number) {console.log(${this.name} moved ${distance} meters.);} } //这个输出如何输出 这段代码定义了一个名为 Animal 的类&#xff0c;它具有一个构造函数和一个 move 方法。构造函数使用 TypeScript 中…

Steam致富:玩免费游戏Banana获得可交易道具

最近&#xff0c;Steam平台上一款普普通通的免费游戏《Banana》引起了轰动&#xff0c;接近2万人同时在线&#xff0c;好评率高达94&#xff05;&#xff0c;究竟是什么让这款游戏如此受欢迎呢&#xff1f;原来&#xff0c;玩家们都在争相获取稀有的香蕉。 《Banana》属于点击放…

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题

vector&#xff08;上&#xff09;&#xff1a;C初阶学习第八弹——探索STL奥秘&#xff08;三&#xff09;——深入刨析vector的使用-CSDN博客 vector&#xff08;中&#xff09;&#xff1a;C初阶学习第九弹——探索STL奥秘&#xff08;四&#xff09;——vector的深层挖掘和…

高通WLAN框架学习(3)- -WLAN FTM 模式(补充)

前提概要: 看过之前那篇文章的都知道FTM的启动模式 高通WLAN框架学习(3)- -WLAN FTM 模式_wifi ftm-CSDN博客 但是目前现在高通主要是通过ptt_socket_app模式启动FTM的 类容介绍如下: 2.2.1 启动 WLAN FTM 在使用任何3种方法进入FTM前,用单板GUI关掉设置菜单里的WI-F…

反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class&#xff0c;这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到…

基于jpcap实现的网络嗅探器

项目功能 基于jpcap实现的网络嗅探器,项目主要主要功能为网络抓包&#xff0c;可以抓取5层协议的数据包&#xff0c;包括TCP、UDP、ICMP、IP、ARP等常见协议&#xff0c; 并支持按照协议、源IP、目的IP或关键字对抓取的包筛选。项目另外实现了基于Java Swing的GUI&#xff0c;…

AI--向量的存储和检索

step1 Document LangChain 实现了Document抽象&#xff0c;旨在表示文本单元和相关元数据。它具有两个属性&#xff1a; page_content&#xff1a;代表内容的字符串&#xff1b;metadata&#xff1a;包含任意元数据的字典。 该metadata属性可以捕获有关文档来源、其与其他文…

pl/sql基础语法操作

oracle pl/sql语言&#xff08;procedural language/sql&#xff09;是结合了结构化查询与oracle自身过程控制为一体的强大语言。 语法执行块 语法结构&#xff1a; [ declare 可选 声明变量部分--declaration statements (1);]begin --执行部分--executable statements (2)…

CentOS-9配置静态IP地址

查看配置命令nmcli CentOS 9 使用 nmcli 命令行工具进行网络配置。以下是配置静态 IP 地址的步骤和示例代码&#xff1a;相对以前centos7之类的&#xff0c;9版本的默认的网络是NetworkManager&#xff0c;网络配置也有较大改变 nmcli con show用vim进行编辑配文件 cd /etc/…

SSL证书有效期缩短有影响吗?

SSL证书是一种用于加密网络通信的安全协议&#xff0c;它可以确保用户在访问网站时&#xff0c;数据传输过程中不会被第三方恶意窃取或篡改。SSL证书通常都有一个有效期限&#xff0c;该期限可以长达几年。然而&#xff0c;最近一些SSL证书颁发机构开始缩短证书的有效期限&…

JavaScript基础(九)

冒泡排序 用例子比较好理解: var arry[7,2,6,3,4,1,8]; //拿出第一位数7和后面依次比较&#xff0c;遇到大的8就换位&#xff0c;8再与后面依次比较&#xff0c;没有能和8换位的数&#xff0c;再从下一位2依次与下面的数比较。 console.log(排列之前&#xff1a;arry); for (…

AWS迁移与传输之SCT

AWS Schema Conversion Tool&#xff08;AWS SCT&#xff09;是一款用于数据库迁移的工具&#xff0c;旨在帮助用户将现有的数据库模式&#xff08;包括表、视图、存储过程等&#xff09;从一个数据库引擎转换到另一个数据库引擎。 AWS提供两种模式转换解决方案&#xff0c;使…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

Web测试面试题(二)

一&#xff1a;简述HTTP协议的状态码包含哪些&#xff1f; 2XX&#xff0c;表示成功 3XX&#xff0c;表示重定向 4XX&#xff0c;表示客户端错误 5XX&#xff0c;表示服务器错误 二&#xff1a;HTTP和HTTPS的区别&#xff1f; 《1》安全性上的区别&#xff1a; HTTPS&#x…

AWS 信息资料

EKS 组件信息&#xff1a;Amazon EKS 附加组件 - Amazon EKS&#xff0c;主要用于程序管理插件。 AWS 区域和可用区信息&#xff1a;全球基础设施区域和可用区 如何解决创建 Amazon S3 桶时出现的错误:如何解决创建 Amazon S3 桶时出现的错误 创建 AWS EC2 实例时 userdata使…

LeetCode题解:9. 回文数,翻转一半数字,JavaScript,详细注释

原题链接 9. 回文数 解题思路 翻转数字 利用循环&#xff0c;每次将x右移一位将移出的数字存储到reversed的个位中每次存储前&#xff0c;需要将reversed左移一位 判断结果 当原x的长度为偶数&#xff0c;翻转后的结果相等当原x的长度为奇数&#xff0c;reversed一定比翻转后…

自养号测评是什么?亚马逊产品评价的全新策略

1、什么是亚马逊测评&#xff1a; 亚马逊测评&#xff0c;简而言之&#xff0c;是基于亚马逊购物平台的一种特定活动。他的核心在于模拟国外消费者的购物行为&#xff0c;并在完成购买后&#xff0c;对所获得的产品进行真实、中肯的评价。这种测评不仅为消费者提供了购物参考&…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样&#xff1f;微软今天给出了蓝图。 今天凌晨&#xff0c;微软召开了Microsoft Build 2024 开发者大会&#xff0c;同前两天的Google I/O开发者大会一样&#xff0c;本次大会的核心词还是“AI”&#xff0c;其中最主要的内容是最新的Copilot…