自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++线程异常检测工具(Valrind之helgrind和DRD)

从日志中,也可以找到相应的锁的签名,看到其对应的关系和顺序。在平常工作生活中,可以借助检测结果,可以快速的发现,可能存在死锁风险问题。因此,通过查看每个锁占用的时间,根据自己的业务逻辑需要进行判定是否可以减小锁的范围,减小独占时间,提高并发性。只能检测某一个锁占用的时间,不能统计多处、多个锁的占用时间。一般程序退出时,都会解锁,但是在程序退出时,仍然持有锁,说明此处发生死锁了。此工具可支持检测:多线程接口使用问题、竞态问题、锁范围问题。首先将应用程序,编译多线程场景下的可执行程序,需要链接。

2024-09-18 00:37:56 469

原创 多线程虚假唤醒

可能很多人都有这个疑问,其实我们再深入分析就会发现,如果生产者线程半个小时才生产一个产品,那么消费者线程在这半个小时内也没闲着,一直在判定产品数量的个数是否大于0了。无效消费,产生的原因是,消费者只是判定了产品数量是否满足消费条件,但未继续等待,因此就浪费了一次消费机会。再次分析发现,一旦消费者发现产品数量为0,一直在等待生产者的生产,但是消费者占用了锁,生产者也获取不到锁,这就造成了一个。因此,条件变量可以让这个过程变得更加高效,生产者生产了产品,通知消费者,已经生产了产品了,消费者可以使用了。

2024-09-18 00:34:27 713

原创 多线程死锁

在多线程编程中,死锁是一个常见的问题,希望通过本节的学习,能帮助大家正确的判断死锁,避免死锁,从而编写出高效和稳定的程序。

2024-09-18 00:32:35 1062

原创 多线程竞态

多线程竞态,是指的多个线程同时访问/修改共享资源时,出现不可预知的结果。

2024-09-18 00:22:43 878

原创 多线程简介&应用

​我们来先看一下冯诺依曼计算机硬件结构:在早期的简单批处理操作系统中,存储设备I/O相对于处理器速度太慢,导致处理器经常空闲。CPU利用率2/170.117611.76%:提高存储器的I/O速度。如果把存储设备的速度再提高,就可以提高CPU的利用率了。确实,在计算机发展的历史中,也在不断地提高存储设备的I/O速率。将计算机的存储设备,分级提高速率,并努力的靠近CPU,如下图所示:但是,尽管这样,仍然无法使得我们的存储设备I/O与CPU的速度媲美。

2024-09-18 00:17:15 632

原创 CMake之add_custom_target

在CMake中,用于定义用户target的函数,且不生成该target对应的文件。在该target中,可以执行相应的用户命令,即命令行下的shell命令,比如可以调用cmakepython和Linux下常用的终端命令行命令。其中,较为常用的为:COMMAND、DEPENDS、WORKING_DIRECTORY和COMMENT。

2023-08-30 22:02:40 527

原创 CMake之find_package

通过find_package引入开源软件的库(动态或者静态库,或者仅包含头文件的库)。CMake官方,在cmake安装路径下的/share/cmake-<version>/Modules目录中,为我们提供了许多寻找依赖包的Find<PackageName>.cmake命名的文件。具体相关模块的介绍,可以查看。注:在全量源码构建时,一般不会,也不能用cmake预定义的路径下的Find<PackageName>.cmake文件。由于Windows中,编写动态库,并使用动态库,代码书写比较麻烦。

2023-08-27 17:28:43 456

原创 CMake之install

将生成的库、可执行程序和相关接口头文件发布出去,install到固定的目录。其中,install的所有安装根目录,均是以。其中,main.cpp、add.cpp、add.h和模块目录CMakeLists.txt文件②的内容,和。config.json文件内容为空,仅仅用于示例需求。同样以之前的代码工程为例,简要介绍几种install的用法。详细的install介绍,可去。变量所表示的目录作为根目录。

2023-08-27 17:28:00 495

原创 CMake之CMake常用变量说明

CMAKE_SOURCE_DIR:整个CMake工程最顶层的CMakeLists.txt文件所在路径。CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt文件所在路径。CMAKE_CURRENT_LIST_DIR:当前*.cmake文件所在路径。CMAKE_BINARY_DIR: 构建目录的顶层路径。CMAKE_CURRENT_BINARY_DIR:构建当前CMakeLists.txt文件所在路径。CMAKE_INSTALL_PREFIX:执行make instal

2023-08-27 17:27:25 457

原创 CMake之头文件target

有时我们的代码功能都在头文件中实现,比如C++中的模板类及相关的成员函数定义或者简单的工具类函数。一般的library都是包含源文件(.cpp、.c)文件,因此我们要使用到。没有源文件,就将该target声明为interface,并指定该target的头文件所在路径为CMakeLists.txt所在的路径。的INTERFACE功能。main.cpp文件,与。

2023-08-27 17:26:40 165

原创 CMake之多target

一个工程中,一般包含多个target库,和一个可执行程序target。

2023-08-27 17:25:57 583

原创 多文件单target

在平常写C++工程代码时,不止一个源文件,而是多个源文件和头文件组成。在此节中,借助简单的C++代码,简要介绍CMake单Target的场景。

2023-08-27 17:25:05 66

原创 CMake之Hello

使用CMake基于CMakeLists.txt文件生成为hello.cpp构建的Makefile文件,并基于此Makefile文件,构建生成相应的可执行程序。笔者当前仅使用了win10,因此以win10作为构建时的操作系统。建议:工具下载时,复制链接,使用迅雷工具下载,速度会更快。此时,已经在build目录下生成。

2023-08-27 17:23:55 79

原创 win10+WSL+Ubuntu环境搭建

查找路径:搜索"WSL"->搜索结果选择"Install WSL"->选择"Manual installation steps for older versions"章节的"Downloading distributions"小节]。此处,提供不在应用商店下载的网址,请查看。注:确定版本后,复制相应版本链接,推荐使用迅雷下载,相比浏览器直接下载,简直天壤之别。这一步骤,网上有很多介绍,此处不做一一介绍。执行解压后的ubuntu.exe文件,就可进入Ubuntu系统。将下载完成的文件,增加。

2023-08-27 16:34:39 288

原创 C++内存使用统计工具(Valgrind之massif)

如果读者使用的是Windows+WSL2的场景,那么就需要安装支持远程桌面和图形化界面的软件包。原因:vector容器,在存储数据时,内存空间不足,则需要申请当前内存的2倍空间,并将数据拷贝到新的内存空间中。应用程序运行一段时间后,内存确实在增长,使用valgrind的memcheck工具检测出来,确实没有出现。问题:从上述程序来看,存储了255个4字节的数据,占用空间约1KB的内存,为何占用了1.5KB的内存呢?结论:10240个4字节的元素,刚好为40KB的内存空间,与预期相符。

2023-08-27 16:29:04 2352

原创 C++内存泄漏检测工具(Valgrind之memcheck)

内存泄漏检测

2023-08-27 16:22:29 520

原创 Python之旅——类的继承属性搜索规则

类的继承属性搜索规则基于LEGB搜索规则,并根据类的继承关系树,自底向上,自左向右搜索,直到找到第一个属性为止。(如果未找到,抛出异常)图片来自:《Learning Python 5th Edition》一书Figure 26-1例如:C1继承C2和C3两个类,那么C1类的对象I1对某个属性的访问,搜索路径I1.name : I1;I1.x : I1->C1;I1.y : I1->C1;I1.z : I1->C1->C2;I1.w : I1-

2021-05-09 23:01:49 184

原创 Python之旅——类相关变量

类相关变量类变量类的变量,类所在的模块被加载时,初始化类变量及其所引用的对象。类变量引用可变类型1.修改可变类型对象成员类方式class Demo(object): a = [1, 2, 3] # list为可变类型if __name__ == "__main__": demo1 = Demo() Demo.a[1] = 88 # 类方式修改对象成员 demo2 = Demo() print("demo1.a=", demo1.

2021-04-18 11:37:39 120 2

原创 Python之旅——模块加载

模块加载模块加载时,主要完成以下动作:在当前模块中加载由import yy或者from xx import yy导入的未被其他模块导入过的模块;对模块中的类或者函数定义进行语法检查(ps:检查类属性和成员函数,不检查函数体),创建类定义对象和函数定义对象;执行模块中的外层语句;将类定义对象、函数定义对象和模块内的对象输出到该模块对应的二进制文件(.pyc为后缀的模块文件)。注:输出到二进制文件有以下两个好处避免模块被重复加载;多次运行程序,若模块未变化,将不再做语法检查,也不创建模块二

2021-04-12 23:50:16 301 1

原创 Python之旅——二维列表陷阱

二维列表陷阱有时候,我们会像下列方式,创建一个n*n的二维矩阵,并都初始化为0:n = 3grid = [[0] * n] * nprint(grid)代码输出:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]看到我们创建的二维矩阵,并都初始化为0了。高兴的接着往下对二维矩阵执行修改操作:n = 3grid = [[0] * n] * nprint(grid)grid[1][1] = 6print(grid)代码输出:[[0, 0, 0], [0, 0,

2021-02-19 21:37:48 186

原创 Python之旅——列表扩展

列表扩展+ :将加号两边的列表进行拼接得到一个新的列表(重新分配的内存空间)+=:将+=右边的列表追加到左边的列表,原地址空间首地址保持不变listA.append(listB):将listB列表作为一个元素添加到listA列表尾(仅占用listA一个元素空间),原地址空间首地址保持不变extend等价于+=+扩展列表listA = [1, 2, 3]listB = [4, 5, 6, 7]print(listA, "addr:0x%x" % id(listA))print(list

2021-02-17 21:25:10 711 1

原创 Python之旅——字符串与列表间转换

字符串与列表间转换字符串分割成列表sentence = "Hello world!"words = sentence.split()print(type(words))print(words)代码输出:<class 'list'>['Hello', 'world!']字符串列表拼接成字符串words = ["hello", "python!"]sentence = "-".join(words)print(type(sentence))print(sentence

2021-02-16 22:01:45 138

原创 Python之旅——列表深浅拷贝

列表深浅拷贝将列表中的值,拷贝到新的容器。先思考一下,采用下列方式,是否能达到拷贝列表的目的?nums = [1, 2, 3]copied_nums = numsprint(f"nums={nums}")print(f"copied_nums={copied_nums}")代码输出:nums=[1, 2, 3]copied_nums=[1, 2, 3]上述仅仅是,将copied_nums变量与nums变量都指向了相同的列表对象。如若不信,请查看下列代码:nums = [1, 2,

2021-02-16 19:29:34 157 2

原创 Python之旅——变量赋值

变量赋值python中,变量是对象的引用。变量赋值,即将变量指向值对象,对值对象的引用。值对象的分类:不可变对象可变对象值对象为不可变对象不可变对象,通俗的讲,就是不可以改变对象的内容。比如:数字,字符串,元祖tuple。变量指向的值对象不可变,但变量的指向可变,即可以改为指向新的值对象。1. 值对象为数字a = 10b = aprint("a addr: 0x%x val: %d" % (id(a), a))print("b addr: 0x%x val: %d" % (id(

2021-01-14 00:12:00 121

原创 Python之旅——字典映射(表驱动)实现switch功能

字典映射(表驱动)实现switch功能本文介绍python中可以使用字典的方式实现和C/C++的表驱动相同的功能,并且代码更加简洁。c/c++的表驱动代码:#include <map>#include <iostream>using namespace std;void foo1(int key){ cout << "foo1:" << key << endl;}void foo2(int key){ c

2021-01-13 23:03:13 917

原创 Python之旅——函数传参

函数参数传值更多文章,请移步☞ https://gitee.com/youngzhiyong/bookPython一切皆对象!!!函数参数传值,函数形参作为对象的引用(形参指向实参对象)。a.常量对象作为函数参数常量对象是一个不可变的对象。当对形参再次赋值时,是形参变量指向一个另外的对象。def update(num): print("num_addr: 0x%x" % id(num), f"num_value:{num}") # id函数是输出对象地址 num = 5

2020-09-09 22:06:33 104

原创 python之旅——跨平台文件编码

文件编码1. python代码文件编码a. Python中的默认编码格式是ASCII格式,在未修改编码格式时,python2将无法解析中文编码。而python3可以进行正确的解析。b. 在python代码文件开头,使用下面两种方式之一标识当前代码文件的编解码(utf或UTF均可)#coding:utf-8#-\*-coding:utf-8-\*-2. 输出文本文件编码 with open("test.txt", "w") as fd: fd.write(test_str)

2020-08-23 21:11:10 170

原创 2.git——代码下载

1. 从远程个人仓库下载    git clone https://github.com/youngzhiyong/scrapy.git2. 只下载指定分支,当前以master分支为例    git clone -b master https://github.com/youngzhiyong/scrapy.git3. 下载当前分支master代码到指定目录dir_name  ...

2019-02-11 21:53:36 185

原创 1.git——代码仓库管理总视图

使用git代码管理的一般流程如上图所示,以scrapy代码为例:私有远端库中没有scrapy代码工程,从公共远端库中fork一个工程到私有远端库。若私有远端库中有scrapy工程,那么只需要从公共远端库merge到私有个人库,对代码进行更新,私有远端库和公共远端库保持一致。 本地库中没有scrapy工程,需要从私有远端库中clone一个工程到本地。本地库中有scrapy工程,更新代码与个...

2018-12-16 10:10:41 711

原创 Python之旅——带着决心出发(第10步)

一、基础篇11.类实例方法调用在类实例方法定义中,第一个参数为self,可认为是实例对象本身,类似于C++中的this指针。两种等价的调用方式:1.obj.obj_method()2.MethodCall.obj_method(obj)注:类方法和类的静态方法不支持第二种调用方式,但支持第一种调用方式。代码举例:class MethodCall: def obj_method(self): pr...

2018-06-10 23:28:37 127

原创 Python之旅——带着决心出发(第9步)

一、基础篇10. 类继承属性搜索规则规则:    根据类的继承关系树,自底向上,自左向右搜索,直到找到第一个属性为止。(如果未找到,抛出异常)图片来自:《Learning Python 5th Edition》一书Figure 26-1例如:C1继承C2和C3两个类,那么C1类的对象I1对某个属性的访问,搜索路径      I1.name : I1;      I1.x    : I1-&gt;C...

2018-06-10 22:25:22 171

原创 Python之旅——带着决心出发(第8步)

一、基础篇9. 类变量、类成员变量、类实例方法、类方法、类静态方法a.类变量 VS 类成员变量类变量:为类所有实例和类本身所共有,使用类或者实例修改类变量,将会影响其他实例类成员变量:为类实例单独拥有,即每一个类实例的成员变量不在同一地址b.类实例方法 VS 类方法 VS 类静态方法类实例方法:第一个参数必须为self,表示实例自身;可调用类方法和类静态方法(self.method)类方法:第一个...

2018-05-13 17:56:12 153 1

转载 python import自定义模块方法(转载)

转自:http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html          https://www.cnblogs.com/master-pokemon/p/6136483.htmlpython包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。下面将具体介绍几种常用情况:(1)主程序与模块...

2018-05-04 12:01:15 949

原创 Python之旅——格式化输出

一、基础篇4. 格式化输出参数 % round formata. %格式化输出的方式和C语言中的printf中的类似。b. round是入参进行四舍五入,但可能会受到计算机能表示浮点数精度影响。c. format的格式化输出比较灵活,可以使用{}或者{n}的方式输出。d. 多参数时,%格式化输出只能按照顺序输出;format的方式,可以根据指定的参数位置进行输出。代码示例:a. print中使用%...

2018-05-04 11:52:07 252

原创 Python之旅——“a = a + b  b = a - b “    VS   “a, b = a + b, a - b“

一、基础篇3. "a = a + b b = a - b " VS "a, b = a + b, a - b"a. 二者输出结果肯定不相同。b. 第一个利用C/C++的思维进行思考即可;第二个是利用python中的元组打包和序列解包的思维思考。假设a为10,b为8,示例解析:a. a = a + b b = a - ba = 10b = 8print("Add first")a ...

2018-05-04 11:50:25 235

原创 Python之旅——else语句

一、基础篇2. Python的else语句异同点:a. if与else语句的使用和C/C++/Java等语言的使用一致;b. Python中存在循环体for/while与else的结合,而C/C++/Java中没有此用法。但类似于C/C++/Java中的if...else{throw...}(不满足if条件,else抛出异常之类的)。执行原理: for/while语句中的循环条件正常结束(包括...

2018-05-04 11:49:16 122

原创 Python之旅——全局变量&局部变量

一、基础篇1.全局变量 VS 局部变量a. 全局变量在整个文件内有效;b.局部变量在函数内有效;c.当全局变量和局部变量同名,局部变量有效。若定义了全局变量,则可在函数内直接使用全局变量。a = 1b = [23, 98]def func():print("a = ", a) #使用全局变量print("b = ", b)b[0] = 9print("b =...

2018-05-04 11:45:17 288

空空如也

空空如也

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

TA关注的人

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