自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 收藏
  • 关注

原创 C++标准模板库 STL 简介(standard template library)

容器的实现就是靠模板类去实现的,例如 C++中的动态数组容器 vector,它其实就是一个类,类中维护了一块地址,然后类中的函数就可以定义为一些数组的行为,例如添加元素,删除元素等等,同时相比于 C 语言中的数组,使用容器因为是类在维护,所以,类中一般会进行安全性判断,对一些不安全的操作会进行规避,例如:C 语言中的数组 a 可以访问 a[-1],但是对于 C++中的容器 a,访问 a[-1]就会被拒绝.一般函数指针可视为狭义的。STL 提供的算法具有工业强度,高性能,用它可开发出性能高效的应用程序。

2023-11-27 19:22:06 265

原创 C++多态-虚函数

同理,如果基类的虚函数是公有的,派生类继承过去的虚函数是私有的,那么可以通过基类指针去访问这个虚函数,而且基类指针指向派生类,那么访问的虚函数内容就是派生类中的内容,因为不是直接通过函数名去访问派生类中这个虚函数的,而是因为虚表替换了虚函数内容,通过虚表访问的,所以尽管派生类中这个虚函数是私有的,通过基类指针也是可以访问的。当基类中有虚函数时,子类继承它他时,同样也会继承它的虚表指针,对于虚函数,子类可以重写他(纯虚函数必须重写),重写了虚函数后,那么子类继承下来的虚表中将会替换被重写的虚函数地址。

2023-11-25 15:09:12 225

原创 C++继承概述

其中,容易让人产生误解的是,是不是虚继承之后,我内部有一个虚表了,就不需要去继承基类的元素了,答案是还是要继承一份基类的元素的,如果单纯是单继承或多继承,虚继承的意义其实并不大,但是对于菱形继承,因为存在数据的二义性,所以对于菱形继承,较有重要的意义。通过受保护继承后,基类中的公有成员在派生类中变成受保护的,派生类可以正常访问,基类的私有数据在派生类中是私有的,派生类不可访问,受保护数据在派生类中还是受保护的,派生类可以访问。但是,使用基类指针访问派生类,只能访问从基类中继承下来的数据,不能访问派生类中。

2023-11-25 14:47:26 138

原创 C++范型编程(范式编程)

例如设计一个数组类型,这个数组可能只能存放 int 类型的数据,但是我们在使用数组时,不一定总是用 int 数组,可能需要其他类型的数组即,数组是一个通用的概念,不应该局限于某种特定的类型(如 int 类型),如果,设计出来的数组,能存放任意类型的元素,那么这就是泛型。开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。在 C++中,用模板来实现泛型,或者说 用模板来表示通用的概念。

2023-11-25 14:19:45 197

原创 C++ -std 编译标准

举个例子,下面是一段 C++代码,里面使用到了 C++11 标准的 auto 自动推导,如果你的编译器没有默认指定以 C++11 标准去编译的会可能就会报错,所以这时我们要手动指定编译标准。原因很简单,时代在发展,编程语言如果停滞不前,最终就会被淘汰。编译器,默认使用的标准版本也不尽相同。甚至于在这些标准的基础上,GCC 编译器本身还对 C。甚至于在这些标准的基础上,GCC 编译器本身还对 C。语言为例,发展至今该编程语言已经迭代了诸多个版本,例如。读者可能会问,这么多标准,GCC。编译标准也是不同的。

2023-11-07 20:03:39 292

原创 C++auto 关键字

在 C++11 中,就赋予了 auto 一个新的功能-自动类型推导。auto 声明的变量必须由编译器在编译时期推导而得,简单来说就是由编译器来识别变量的类型。后变成了局部的自动变量,就是当前变量的生存周期是由编译器自动决定的,但是这和局部变量没有区别,所以。,在编译阶段编译器需要根据初始化表达式来推导 auto。语言中它的作用是声明自动变量,例如。编译报错,影响重载形式下的调用绑定。语言中就已经存在了,只不过在。的声明,而是一个类型声明时的。替换为变量实际的类型。,编译器在编译期会将。

2023-11-07 19:59:36 96

原创 C++范围枚举

若不指定枚举成员类型,限定作用域枚举类型成员默认为 int,不限定作用域枚举类型成员不存在默认类型,能够确定的是成员类型足够大到能容纳所有成员。在旧标准中,枚举变量可以使用整数常量进行赋值,但在 C++11 标准中,要想初始化枚举类型对象或对枚举对象赋值,必须使用该类型的一个枚举成员或该类型的一个对象。3. 不限定作用域枚举类型的枚举成员与枚举类型外部数据处在同一个作用域范围内,多个枚举类型不能有同名的枚举成员。相对于不限定作用域的枚举类型,限定作用域的枚举类型定义的枚举成员在枚举类型作用域外不可访问。

2023-11-07 19:54:03 93

原创 运算符重载(operator)

我们再举例两个个二元流运算符<<和>>,实现要对运算符进行重载,我们就一定要清楚,运算符的操作数都应该为啥类型,上面我们重载+号是为了实现两个 A 类相加,得到一个 A 类,所以运算符重载函数的参数就是两个 A 类引用,返回值 为 A 类,现在对<<和>>进行重载,我们希望可以通过<<输出类的成员变量,利。在学习类的 this 指针的时候我们知道成员函数是默认有一个隐藏参数指向该类的地址的(this),那么也就是说,如果我们将运算符重载函数声明为类的成员函数后,就不需要传递调用者自身的一个对象了。

2023-11-07 19:42:25 339

原创 类(class)

按 c++的封装性来说,最主要的目的就是确保数据的安全,实现信息的隐藏,从原则上来 说,类的私有成员和保护成员,在类的外部是不能直接访问的,但是,有一个例外,这个就是友元(friend),友元就是在类的声明中,用关键字 friend 修饰的函数或者类,友元授予一个函数或者一个类特权,允许他们能直接访问本类的隐藏信息.定义号一个人的属性之后,如果想对这个人有所操作的话,就要去定义函数,然后去在主函数中去实现一些函数的过程逻辑,所以说 c 语言是一种面对过程编程的语言,而在 C++中,对结。

2023-11-06 20:34:07 584

原创 C++中的函数玩法

函数调用是有时间和空间开销的。因为带默认参数的函数,传递参数时传递的个数是可变的,那么当遇上上面情况时,如果调用 sun(2,3)就会报错,会产生模糊的调用,而调用 sun(2,3,4)则可以正确的重载到 sun(int a,int b,int c =3)这个函数。前面章节我们讲过,在 C++中,函数会被经过换名处理,新的名字是受返回值,函数名,形参决定,所以只要是参数类型不同,参数个数不同,参数的顺序就可以定义相同的函数名。在编译的时候,系统会根据你传递的实参个数或类型来匹配对应的函数,这就叫函数重载。

2023-11-06 10:36:53 57

原创 C++内存分配 new 和 delete

而使用 new(std::notheow)在分配失败的时候就不会抛出异常,而是直接将该指针置空,后续你只需要判断这个指针是否为空就可以知道 new 分配成功与否,例如。在实际开发中,内存的分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。如上,当使用 new 或 new []分配空间不足时,就会抛出异常,但是指针并不会置空,这样就会给这个指针后续的判断使用存在一些隐患。内存分配失败的时候抛出的异常,在分配异常的情况下这时的指针。来替代普通的new 可以更加安全!

2023-11-06 10:24:31 129

原创 C++引用概述

1.指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,可以理解为是原变量的一个别名而已。变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),程序中通过变量来申请并命 名内存空间,通过变量的名字可以使用存储空间。2. 引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。5. 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。6. sizeof 引用得到的是所指向的变量。

2023-11-02 20:11:22 71

原创 C++深拷贝和浅拷贝

拷贝发生于用被拷贝对象实例化新对象,过程中被拷贝对象的属性值会 一 一 赋值给新对象。那么当我们的类中存在指针或者动态的内存分配时,使用普通拷贝(浅拷贝,默认拷贝)只会将那块内存的位置告知当前对象,并不会重新为新对象分配内存。当一个对象去拷贝(创建)另一对象时,拷贝完以后,这两个对象之间存在资源共享,这样的拷贝称之为浅拷贝,当用一个对象去拷贝另一个对象,拷贝完以后,这两个对象之间不存在资源共享,这样的拷贝称之为深拷贝。3.深拷贝重新申请了空间,改变被拷贝对象时拷贝对象不会变化;

2023-11-02 20:04:59 101

原创 C++中的强制类型转换方式

在上面所有形式中,e 的类型必须符合以下三个条件中的任何一个:e 的类型是是目标类型 type 的公有派生类、e 的类型是目标 type 的共有基类或者 e 的类型就是目标 type 的的类型。e也可以是一个空指针,结果是所需类型的空指针。static_cast 相当于传统的 C 语言里的强制转换,该运算符把变量转换为指定类型,用来强迫隐式转换,例如 non-const 对象转为 const 对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。

2023-11-02 20:01:00 143

原创 C++异常处理

上面就是 std 中包含的一些异常类型,它们都是继承 exception 而来的,例如当使用了无效的参数时,就会抛出一个 std::invalid_argument 的错误,而程序开发者其实要定义新的异常类型时,可以继承 exception 类来做处理。上图是系统中 bad_alloc 异常类型的由来,可以看到他也是继承 exception 而来的,由此示例,当我们想要其他类型的异常处理的时,我们也可以根据上图的方法去继承一个新异常类型,例。如果抛出其他类型的异常,try 将无法捕获,只能终止程序。

2023-11-02 19:50:20 55

原创 C++和 C 混合编程处理

在 C++中提供了一个关键字:extern "C",称为链接指示,即告诉 C++编译器,用 extern "C" 修饰的函数,是用 C 编译器编译的,当调用这个函数的时候,不要去修改它们的名字,大多数情况下,extern "C" 是写在头文件中的。但是用 C 开发的功能,很可能已经用 C 编译器编程成目标文件(或打包成库了),那么目标文件中的函数名已经确定下来了,C++去调用函数时,会进行换名处理,将导致,在目标文件中找不到对应的函数。那么怎么解决 c++会对 c 函数进行换名处理而找不到定义呢?

2023-11-02 19:31:18 131

原创 C++标准输入输出类cout,cin用法概述

在使用 cout 对内容格式进行控制的操作一般在 std 里面的一些类可以对其进行处理,具体的一个介绍将关注后续容器一章的讲解,下图讲述了一些输出格式控制的控制类,可以根据所需操作对应去查找相关 std 容器的用法。可以看到 ignore 把缓冲区字符 p 之前的都清除了,也包括 p,其中 ignore 的第一个参数是一个最大清除流大小的一个字段,只要将它设置的足够大,就只有第二个参数有效了。需要注意的是,使用 cin 输入的时候,输入的类型一定要正确,否则会出现意想不到的错误,

2023-11-02 19:25:21 325

原创 C++命名空间概述

using 关键字可以对命名空间进行引用,比如有一个主文件夹,也就是我们的主进程空间,里面有一个子文件夹 叫 sdt,也就是我们的 std 名字空间,std 这个子文件夹中有一个 cin 文件,一般我们是没法直接在主文件夹是没法 cin 的,而要进入 std 子文件夹中去使用它,也就是我们在使用 cin 的时候需要 std::cin 去索引它,而 using 的作用就是可以将这些子文件中的东西拷贝到主文件中,也就是可以不使用作用域符::去索引就可以使用名字空间中的东西。的名字空间中声明和定义的。

2023-11-02 17:26:33 48

原创 SQLITE3 函数接口

当我们的 sql 语句是 读命令,比如"SELECT* FROM...",返回的数据必然是很多行,而 sqlite3_step 调用每次只返回一行,并且函数返回值为。, 一旦执行成功后,sqlite3_step()就不应该被再次调用执行, 除非我们使用 sqlite3_reset()重置 sqlite3_stmt 数据。数据库的连接句柄(数据库的文件描述符) 代表你打开的那个 sqlite3 的数据库文件,后序对数据库的操作都需要用到这个对象。返回语句对象 select 结果集中的列数,没有则返回 0。

2023-10-31 15:16:11 1323

原创 sqlite3 关系型数据库语言 SQL 语言

上面语句就是新建一个 CJB 表格,其中 ID 是外键,这个外键是 STU 表格中的主键,其中这个 REFERENCES 是外键约束,表示这个外键是哪个表里的主键。包括 CHAR、VARCHAR(变长字符串)、BINARY(二进制)、VARBINARY(变长二进 制)、BLOB、TEXT(文本)、ENUM(枚举) 和 SET 等。2.查看表 STU,CJB 和 KCB 中相关列满足 STU.ID = CJB.ID 且 KCB.KCH = CJB.KCH 条件的数据。//降序排序并只查看前 3 行。

2023-10-31 09:55:19 1067 1

原创 常用 sqlite3 命令

让我们在命令提示符下键入一个简单的 sqlite3 命令,在 SQLite 命令提示符下,您可以使。本次将向您讲解 SQLite 编程人员所使用的简单却有用的命令。退出 sqlite 提示符(.exit 和.quit)列出数据库名字和所依赖的文件(.databases)的点命令,这些命令的不同之处在于它们不以分号。显示当前数据库的所有表格(.table)显示建立表所用的原命令(.schena)显示各种状态当前值(.show)帮助信息命令(.help)用各种 SQLite 命令。帮助信息命令(.help)

2023-10-30 10:50:49 2170

原创 数据库简介和sqlite3安装

成绩表中的学号不是成绩表的主键,但是它和学生表中的学号相互对应,并且学生表中的学号是学生表的主键,则称成绩表的学号是学生表的外键.(在本表中不是主键,但是在其他表中是主键)非关系型数据库一般强调的是数据最终一致性,不像关系型数据库一样强调数据的强一致性,从非关系型数据库中读到的有可能还是处于一个中间态的数据,非关系不提供对事务的处理。数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。适合处理海量数据,但是不一定安全。

2023-10-27 10:20:11 331

原创 域名系统 DNS

这是因为在这种因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。查询名部分长度不定,一般为要查询的域名(也会有 IP 的时候,即反向查询)。该值由发出 DNS 请求的程序生成,DNS 服务器在响应时会使用该 ID,这样便于请求程序区分不同的 DNS 响应。3:Name Error,只在权威 DNS 服务器的响应中有意义,表示请求中的域名不存在。上图这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号com 是顶级域名,标号。占 16 位(无符号)。

2023-10-26 15:16:16 439

原创 NTP(Network Time Protocol 网络时间协议)

大数据产生与处理系统是各种计算设备集群的,计算设备将统一、同步的标准时间用于记录各种事件发生时序,如 E-MAIL 信息、文件创建和访问时间、数据库处理时间等。大数据系统是对时间敏感的计算处理系统,时间同步是大数据能够得到正确处理的基础保障,是大数据得以发挥作用的技术支撑。不同的值所表示的含义分别是:0 未定义、1 表示主动对等体模式、2 表示被动对等体模式、3 表示客户模式、4 表示服务器模式、5 表示广播模 式或组播模式、6 表示此报文为 NTP 控制报文、7 预留给内部使用。

2023-10-26 14:52:46 298

原创 获取套接字协议地址函数

该函数可以获取 listen 监听的 sockfd 套接字的外地协议地址信息。适用与当服务器调用 accept 函数连接客户端后进入其他线程或进程,就只能使用 getpeername 获取客户端的协议地址信息了。该函数可以获取 sockfd 套接字的协议地址信息,放到 addr 中,特别适合未调用 bind()就。调用了 connect(),这时唯有 getsockname()调用可以获知系统内定的本地地址。获取与套接字关联的外地协议地址(getpeername)保存获取到的协议地址的长度。

2023-10-26 14:40:12 63

原创 广播和组播(多播)

它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。单播用于两个主机之间端对端的通信,例如我们的 TCP/UDP 消息通信,广播用于一个主机对整个局域网上所有主机的数据通信,单播和广播其实是两个极端,实际情况下,我们需要对网络上面一组特定的主机通信,这就是多播/组播,2.现行网络虽然都支持组播的传输,但在客户认证、QOS(指一个网络能够利用各种基础技 术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。

2023-10-26 14:09:04 311

原创 linux套接字选项API

如果是 TRUE,套接字就可与一个正由其他套接字使用的地址绑定到一起,或与处在 TIME_WAIT 状态的地址绑定到一起。返回套接字建立连接的时间,以秒为 单位,如尚未连接,返回 0xffffffff。如果 TRUE,套接字就会进行配置,在会话过程中发送”保持活动”消息。获取或设置与套接字上数据接收对应的超时时间值(以毫秒为单位)获取或设置套接字上的数据发送超时时间(以毫秒为单位)对于 IP 层次有下面常用选项。对一个面向消息的套接字来说,一条消息的最大长度。获取套接字的选项值(getsockopt)

2023-10-26 11:36:08 305

原创 UNIX 域协议(本地通信协议)

UNIX 域协议进行本地通信的方式和 TCP、UDP 很类似,下面就以 UNIX 域协议的流式套接字来写一个客户端和服务器间通信的例子,使用流式套接字,则本地间的通信方式就要类似于 TCP,这样的通信方式同时也具有 TCP 通信的特点。IP 协议标识客户服务器是通过 IP 地址和端口号实现的,UNIX 域协议中用于标识客户机和服务器的协议地址的是普通文件系统中的路径名。3.UNIX 域套接字域传统套接字的区别是用路径名表示协议族的描述。UNIX 域数据报服务是可靠的,不会丢失消息,也不会传递出错。

2023-10-26 10:35:06 922

原创 TCP/IP网络协议通信函数接口

通过 socket 函数创建的套接字时,它是被假设成一个主动套接字的,也就是说它是一个调用 connect 去连接服务器的客户端套接字,而 listen 函数就是将一个未连接的套接字变成一个被动套接字,指使内核应该接收指向该套接字的连接请求,根据 TCP 三次握手的示例图得知,调用 listen 函数会导致套接字从 CLOSED 状态变为 LISTEN 状态,同时 listen 函数的第二个参数还将指定与该套接字连接的最大个数。当函数的返回值为 0 时,表示 src 指向的值不是合法的 IP地址;

2023-10-08 16:56:34 998 1

原创 TCP 和UDP通信流程

对于 UDP 通信,其实没有服务端和客户端之分的,反而有点类似于进程间通信一样,只需 要向对于的 IP 端去发送消息即可,上图中服务端的 bind 可有可无,它们之间进行通信的流程就是首先使用 socket 去创建一个数据包套接字用于 UDP 通信,然后就使用 sandto 进行发送消息,用 recvfrom 进行读取消息,不能使用 read 和 write 是因为 UDP 通信需要知道对方的 ip 地址的,而 read 和 write 是不具备该参数的。读接口:read,recv,recvfrom。

2023-10-08 14:52:39 582

原创 基本网络协议

基于上面的优缺点,那么当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如 HTTP、HTTPS、FTP 等传输文件的协议, POP、SMTP 等邮件传输的协议应该使用 TCP 协议。慢,效率低,占用系统资源高,易被攻击 TCP 在传递数据之前,要先建连接,这 会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的 CPU、内存等硬件资源。

2023-09-23 15:18:15 176

原创 网络协议层次模型

模块中,首先会计算一下校验和,判断数据是否被破坏。每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层所必要的信息,如发送的目标地址以及协议相关信息。在 TCP/IP 模型中,我们讲将OSI 模型的应用层,表示层和会话层合并为 TCP/IP 模型的应用 层,讲数据链路层和物理层合并为 TCP/IP 模型的数据链路层,使得 TCP/IP 模型只有四层,如下图。如果不是发给自己的包则丢弃数据,而如果是接收到了恰好是发给自己的包,就查找以太网包首部中的类型域从而确定以太网协议所传送过来的数据类型。

2023-09-23 14:18:53 156

原创 linux 文件锁

当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。进程使用 flock 尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉,或者在调用 flock 的时候,采用 LOCK_NB 参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误。flock 锁的释放非常具有特色,即可调用 LOCK_UN 参数来释放文件锁,也可以通过关闭 fd 的方式来释放文件锁(flock 的第一个参数是 fd),意味着 flock 会随着进程的关闭而被自动释放掉。记录锁是更细粒度的文件锁。

2023-09-19 16:43:31 653

原创 利用prctl 函数给线程命名

(其中 4623 是进程号,4624 是线程号) 然后可以查看这个目录中的 stat 文件,可以看到如下结果。这两个文件都记录了线程的一些信息,我们看到线程名发现就是我们通过 prctl 设置的。可以看到进程号为 4623,然后可以通过 ps -L -p 4623 查看该进程号中的线程名字。对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。使用 prctl 函数,第一个参数置为 PR_SET_NAME 就可以实现给调用者线程命名,也可以查看 status 文件,可以看到如下结果。

2023-09-19 16:21:31 275

原创 linux-线程条件变量(cond)

如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。想象一种情况,我创建一个线程去执行下雨收衣服的工作,但是大多数时候天气都是晴天,只有下雨天这个线程才会去工作,那么我就需要这个线程睡眠,不要浪费CPU 资源,等下雨时我再叫醒它起来工作就行了,线程条件变量就是扮演这样一个角色。在 linux 的 pthread 中使用条件变量的类型为:pthread_cond_t 表示一个条件变量。

2023-09-15 17:59:35 367

原创 linux-读写锁(rwlock)

动态初始化是在堆中申请空间,需要释放,而静态初始化是在静态存储区中创建,不。在 linux 中,通过 pthread_rwlock_t 结构来表示一个读写锁。1.如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作;3 如果某线程申请了读锁,其它线程可以再申请读锁,但不能申请写锁;4.如果某线程申请了写锁,其它线程不能申请读锁,也不能申请写锁。读写锁与互斥量类似,不过读写锁允许更改的并行性,释放读写锁(pthread_rwlock_destroy)读写锁的属性,为 NULL 表示默认属性。

2023-09-11 11:13:00 285

原创 linux-自旋锁(spinlock)

自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,这些操作会导致线程发生两次上下文切换!要设置的自旋锁属性,为 PTHREAD_PROCESS_PRIVATE 表示互斥锁只能在本进程中使用,为 PTHREAD_PROCESS_SHARED 表示互斥锁可以在不同进程间使用。解决资源冲突的,即,一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到,只能够原地“获取自旋锁 lock。

2023-09-08 16:43:16 202

原创 线程互斥锁(mutex)

线程之间的需要访问一些共享资源,为了保证对共享资源的有序访问,防止竞争,需要对共享资源进行某种方式的保护,使得共享资源有序访问,线程互斥锁就是用来实现线程间互斥的一种手段。要设置的线程属性,为 PTHREAD_PROCESS_PRIVATE 表示互斥锁只能在本进程中使用,为 PTHREAD_PROCESS_SHARED 表示互斥锁可以在不同进程间使用。就像线程具有属性一样,用于线程互斥的互斥量的也有相应的属性,互斥量属性的数据类型是用 pthread_mutexattr_t。

2023-09-06 10:18:49 108

原创 linux线程概述

此外,这些线程的调用进程没有有效的用户 ID 0。一个线程退出.它的资源是否全部被释放,取决于它的分离属性,设置分离的线程在线程结束后会自动释放线程的资源,而处于非分离状态的线程该线程结束,它有部分的资源不会自动释放,必须要其他的线程调用 pthread_join 这个函数才能释放所有资源。保存线程的竞争范围,为 PTHREAD_SCOPE_SYSTEM 或 0 时,线程将与系统中所有的线程竞争,为 PTHREAD_SCOPE_PROCESS 或 1 时,线程将与进程中的线程竞争。

2023-08-31 17:37:36 40

原创 信号量,消息队列,共享内存总结

在加锁的时候会有一个 SEM_UNDO 的设置,也就是在调用 semop 的时候指定操作结构体当中可以放置一个 SEM_UNDO 参数, 这样的 UNDO 选项会让内核记录一个与调用进程相关的 UNDO 记录,如果该进程崩溃,则根据这个进程的 UNDO 记录自动恢复相应信号量的计数值。然而,如果是一个进程 lock,而另一个进程 unlock,我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。

2023-08-28 17:38:46 122

C++编程基础知识概述

C++是一种强大且广泛使用的编程语言,用于开发各种应用程序,从系统级应用到图形用户界面。本文将为您提供一份C++基础知识的概述,帮助初学者了解这门语言的核心概念。这篇文章提供了C++基础知识的概览,帮助读者了解这门语言的核心概念。如果您想更深入地学习C++,可以探索面向对象编程、模板编程、多线程编程等更高级主题,以充分利用这门强大的编程语言。

2023-11-01

sqlite3数据库使用概述

SQLite3在Linux编程中具有重要作用。作为嵌入式关系型数据库管理系统,它提供了有效的数据存储和管理方式。在Linux环境中,SQLite3无需额外的数据库服务器即可被嵌入到应用程序中,从而简化了应用的部署和维护。SQLite3不仅支持多种数据类型和SQL查询语言,还拥有ACID属性(原子性、一致性、隔离性和持久性),保障了数据的完整性和安全性。这对于Linux应用程序至关重要,特别是那些需要多会话数据共享的情况。数据持久性是SQLite3的另一优势,确保即使在应用程序关闭和重新启动后,数据依然可用和一致。SQLite3的性能出色,能够处理大量数据并支持复杂查询。它具有高效的索引机制,适用于各种应用场景,从嵌入式系统到大型服务器应用。学习SQLite3对于Linux编程者而言,是一项有价值的技能。它易于学习和使用,拥有丰富的文档和社区支持。无论是初学者还是经验丰富的开发者,都能受益于SQLite3的学习,提高数据管理和操作的效率,为应用程序提供稳定和可靠的数据存储能力。总之,SQLite3在Linux编程中为数据管理和持久性提供了强大的支持,有助于构建各种类型的应用程序。

2023-10-26

linux-网络编程应用分享

本资源中将为大家讲述在linux环境下对于TCP/UDP网络编程的使用讲解,解剖每个相关函数的含义与用法,以及使用实例的展现,让读者更能体会到网络编程的乐趣性,非常适合对linux系统,C语言有一定基础的同学进行学习观看。

2023-09-21

linux-进程和线程

在Linux环境下进行C编程时,经常会面临一个问题,即需要同时处理多个任务。那么,在这种情况下,我们应该如何设计代码以实现多个任务的有序执行呢?本文旨在分享进程和线程编程基础知识,并与大家探讨在C语言中使用进程和线程以及互斥处理的方法。

2023-07-26

C语言-文件IO知识点

该文档是对文件操作 API 做一个解释与讲解,文件操作一直以来是作为嵌入式程 序员必要掌握的一个操作,因为在 linux 系统中,万物皆文件,所以掌握好文件操作非常重 要…。

2023-05-23

LINUX基础操作命令及脚本

本篇文档主要记录了 linux 的一些基本命令以及一些 linux 中常遇的一些操作,还有对 linux 环境的脚本语言使用进行说明,在对本文档进行学习的时候,作者希望读者是对 linux 有一定了解的,在使用的时候最好运行 linux 去实践学习

2023-05-23

数据结构与算法知识总结

本文章主要对数据结构和算法做一个介绍和程序设计讲解,对于数据结构和算法其实我更愿意称数据结构为一种数据思想,对于之前我们学的所有东西而言,例如 c,c++,网络,进程线程,数据库什么的,他们所有的特点都是要我们去记住它,掌握它怎么使用,语法规则,函数用法,参数含义,这些是我们关注的点,但对于数据结构和算法而言,其 实它没有什么新奇的关键词语法,没有功能强大的 api,那为什么数据结构能够独立出来,成为很火的一种学科呢,就是因为数据结构讲的其实是一种数据思想,作者希望读者在学完数据结构后不仅仅是会用数据结构的作物,更要时刻明白其中的思想才是最重要的,例如学习完栈,我们知道栈这种结构的一种使用的同时,更应该去理解栈的这种思想,这种使用条件使其成为一种可以先进后出的结构,来解决一些常见的问题,例如递归问题。不仅栈是如此,后面介绍的形形色色的结构都是由一些基础结构通过限制某种条件(例如栈,队列),或通过结构的组合(例如结构体和结构体指针组合形成链表)来变化成各种功能强大的数据存储结构,所以我们应该清楚,数据结构我们是学不完的,每一种条件每一次组合都可以形成一种新的存储结构。

2023-05-10

C语言程序设计进阶知识点

本文章主要是对 c 语言的一些关键词和结构语句做一个更深层次的理解,以及对一些 常用系统函数 api 做一些使用介绍。

2023-05-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除