- 博客(15)
- 收藏
- 关注
原创 同步操作和强制排序
1.同步操作和强制排序假设你有两个线程,一个向数据结构中填充数据,另一个读取数据结构中的数据。为了避免恶性条件竞争,第一个线程设置一个标志,用来表明数据已经准备就绪,并且第二个线程在这个标志设置前不能读取数据。下面的程序清单就是这样的情况。不同线程对数据的读写#include <vector>#include <atomic>#include <iostream>std::vector<int> data;std::atomic<
2023-12-27 12:46:06
949
1
原创 C++内存模型和原子类型操作
C++11标准中,有一个十分重要特性,常被程序员们所忽略。它不是一个新语法特性,也不是新工具,它就是多线程(感知)内存模型。内存模型没有明确的定义基本部件应该如何工作的话,之前介绍的那些工具就无法正常工作。那为什么大多数程序员都没有注意到它呢?当你使用互斥量保护你的数据和条件变量,或者是“期望”上的信号事件时,对于互斥量为什么能起到这样作用,大多数人不会去关心。只有当你试图去“接触硬件”,你才能详尽的了解到内存模型是如何起作用的。C++是一个系统级别的编程语言,标准委员会的目标之一就是不需要比C++
2023-12-26 18:58:52
1142
1
原创 异步线程和高级线程池管理
async与future:std::async是一个函数模板,用来启动一个异步任务,它返回一个std::future类模板对象,future对象起到了占位的作用(记住这点就可以了),占位是什么意思?就是说该变量现在无值,但将来会有值(好比你挤公交瞧见空了个座位,刚准备坐下去就被旁边的小伙给拦住了:“这个座位有人了”,你反驳道:”这不是空着吗?
2023-12-21 08:47:44
1018
原创 C++多线程并发
线程:线程是操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务,它们的本质都相当于多个人去合伙完成一件事。多线程并发:多线程是实现并发(双核的真正并行或者单核机器的任务切换都叫并发)的一种手段,多线程并发即多个线程同时执行,一般而言,多线程并发就是把一个任务拆分为多个子任务,然后交由不同线程处理不同子任务,使得这多个子任务同时执行。
2023-12-20 20:34:08
1543
1
原创 Shell
Shell是一种应用程序,用于交互式地解释和执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能,这一过程称为Shell命令解析器。作为用户和Linux内核之间的接口程序,Shell在执行命令时起到保护内核的作用。只有Shell能够识别的命令才能够直接操作内核来控制硬件。Shell还可以被看作是一种程序设计语言,具备各种变量和参数,提供了类似高级语言的控制结构,如循环和分支。在这方面,Shell脚本的应用使得用户能够简化复杂的系统管理和应用程序部署操作。- 定义以开头: `#!
2023-12-18 13:35:24
173
1
原创 对象模型(对象树)
在创建QObject对象时,可以提供一个其父对象,我们创建的这个Q0bject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构.
2023-12-17 08:59:35
229
1
原创 纯虚函数和多继承
绝大数面向对象语言都不支持多继承,但是绝大数面向对象对象语言都支持接口的概念,c++中没有接口的概念,但是可以通过纯虚函数实现接口。接口类只是一个功能声明,并不是功能实现,子类需要根据功能说明定义功能实现。这段代码演示了基类和派生类的关系,通过虚函数实现了多态性,以及析构函数的调用顺序。多继承带来了一些争议,但是接口继承可以说一种毫无争议的运用了。虚析构作用:在调用基类的析构函数之前,会先调用子类的析构函数。接口类中只有函数原型定义,没有任何数据定义。注意:除了析构函数外,其他声明都是纯虚函数。
2023-12-15 17:24:30
230
原创 c++语言中第三个基本特征----多态
多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。c++支持编译时多态(静态多睦)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。
2023-12-13 16:13:45
105
1
原创 c++继承类
class 派生类名:继承方式基类名派生类新增的数据成员和成员函数class DerivedClass : [访问修饰符] BaseClass {// 派生类的成员声明public:// 派生类的公有成员protected:// 派生类的保护成员private:// 派生类的私有成员是派生类的名称。[访问修饰符]可以是publicprotected或private,用于指定派生类继承基类的成员的访问级别。这个部分可以省略,默认为private继承。BaseClass。
2023-12-13 10:47:26
311
1
原创 重载自加自减运算符
自增运算符和自减运算符是有前置和后置之分的,如:a++ // 后置自增运算符 ++a // 前置自增运算符 b-- // 后置自减运算符 --b // 前置自减运算符。这说明 (++a) 返回的是自增后 a 变量, a 变量在后续运算过程中,a 变量的值会被修改。是不成立的,所以后置运算符的重载函数的返回值就是普通的对象。a 先自增 +1 后, a 的值就为 1 ,然后再参与 a=5 的运算,所以最后 a 的值是 5。// 后置自增运算符的重载函数,多一个没用的参数。
2023-12-12 12:29:41
203
原创 类对象成为另一个类的成员
类中有多个对象时,构造的顺序是先构造里面的对象,在构造外面的对象。类中有多个对象时,析构时顺序是先析构外面的对象,在析构里面的对象。声明的顺序决定了构造函数的顺序。已有一个类class A, 再定义一个类class B,这样在B的定义中,就可以有一个A*类型的成员变量。需要注意的是,要使用这种形式的定义,要么A的定义在B的上方,要么在B定义前加一个A类的声明。
2023-12-11 12:20:53
189
1
原创 c++设计一个person类封装name和age属性
设计一个 Person类,Person类具有name和 age属性,提供初始化函数(Init),并提供对name和 age 的读写函数(set , get),但必须确保 age的赋值在有效范围内(0-100),超出有效范围,则拒绝赋值,并提供方法输出姓名和年龄。首先检查年龄是否在有效范围(0到100之间),如果是,则设置年龄和姓名,否则将年龄设为默认值并输出错误消息。这段代码实现了一个简单的 Person 类,该类具有姓名(m_name)和年龄(m_age)属性。get_age函数:返回对象的年龄。
2023-12-10 13:28:32
820
1
原创 用jTessBoxEditor制作训练库
记录自己的实践成果(慢慢来总会有回报)做课题的时候,用tesseract-ocr进行字符识别时,有官方提供的字库,但这些字库并不能满足我们所有的需求,例如手写字体以及一些其他的字体。tesseract提供的字库中没有我们相应的字体时,就会出现识别错误的问题,这个时候就需要训练自己的字库进行训练了。
2023-11-29 21:44:21
1095
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人