weakptr中的lock函数 C++ 中的weakptr 中lock 函数可以构造出一个{弱引用指针观察的强引用计数} shareptr。在过程通过weakptr 构造shareptr 保证了原子操作从而避免了。空悬的weakptr的问题 避免了空悬的shareptr问题。同样定义了 强引用和弱引用 对应上面两种情况。强是全局的变量和函数 的 初始化和定义的。弱是没有初始化 全局变量 和 函数定义。C语言中强符号 和 弱符号。
C++ std::condition_variable notify_one()与notify_all()的作用 notify_one()与notify_all()常用来唤醒阻塞的线程,线程被唤醒后立即尝试获得锁。notify_one()因为只唤醒一个线程,不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,等待再次调用notify_one()或者notify_all()。notify_all()会唤醒所有阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续尝试获得锁?答案是会阻塞,等待操作系统在互斥锁的状态发生改变时唤醒线程。
QT Creator 这个时候QT Creator 会频繁的崩溃 这个时候删除配置文件通常位于 C:\Users<你的用户名>\AppData\Roaming\QtProject\ 和 C:\Users<你的用户名>\AppData\Roaming\Qt Creator\。QT Creator 中打开源码时候可能失败了,导致有大量记录无法打开。
QT 中场景坐标 但是如果设置了setSceneRect 矩形区域的话 ,也就是场景的左上角的坐标。这个时候 左上角的坐标 就和 view窗口的左上角 原点重合了。也就是0.0点 view 会自适应这个 原点坐标。场景坐标的原点永远是是 笛卡尔坐标系的原点。
python 多线程 系统创建多进程的机制是不一样的,linux 系统的子进程会clone 父进程的。在使用多进程在linux 系统中要注意 linux 系统的机制和window。所以这个时候 文件打开,数据库操作等等 要重新连接 重新打开文件等等。文件描述符,这样也就导致了 父进程的文件的读写位置和子进程是一样的。python 中有全局锁GIL 所以在计算密集型的程序中。要使用多进程的方式 代替多线程计算。
CMake是怎么找到Qt相关模块的 一般我们不会在CMakeLists里面硬编码CMAKE_PREFIX_PATH,推荐通过环境变量找到模块。深入了解find_package之后,我们就明白COMPONENTS其实是一个选项,列出来了必选的模块。当我们使用QT创建了一个CMake项目后,我们尝试使用CMake编译时,会遇到找不到Qt的模块的问题,Qt的模块是放在Qt/5.15.2/clang_64/lib/cmake,所以我们只需要配置。记得将QT_DIR环境变量放到PATH中,因为find_package会从PATH中寻找。
信号量-- Semaphore,对多线程有过了解的人都听说过,一般我们解释为“信号量”。可是,这个单词对我们来说还是比较陌生,它和另一个单词 Singal(信号)什么关系呢?想要真正理解这个概念,必须得从它的翻译开始。事实上,Semaphore 最好的翻译应该为“信号计数量”,承认了这一点,想必你也清楚了:它和 Signal 不是一回事!这个信号计数量 === 计数量 是很准确的翻译。
QT movetothread 之后 会调用 Qthread 中的run 函数 ,run函数 执行 exec 函数。如果自己重载 run 函数 ,那么也可以,但是如果不执行 exec 启动消息循环。今天在次看 官方文档 Qthread --> call Start 函数。启动消息循环 ,这样只要线程不退出 就可以一直处理 消息。之前一直不明白为啥把对象 移动到线程之后。也就能处理 跟这个线程 相关的槽函数了。他的槽函数 就会在 新线程程中运行了。就不能处理 线程关联的对象的槽函数了。关于movetothread 的。
opengl 坐标系理解 在固定功能绘制管线情况下,默认OpenGL中model-view与projection矩阵都是单位矩阵。默认3D 物体的自己的坐标系是和世界坐标系重合的。世界坐标系是原点默认也在屏幕的中心点。如果没有应用任何变换,对象坐标系、世界坐标系、照相机坐标系和裁剪坐标系是重合的。
ldd notfond问题 是因为 系统的默认搜索路径找不目标so. 这个时候 设置一下系统环境变量。linux ldd 分析找不到 so 动态库的时候。LD_LIBRARY_PATH 系统环境变量就好。
C++ 随笔 成员函数 还是单独存在的。就是在成员函数被调用的时候把this指针传递给成员函数,当访问成员数据时候。在内存中看C++类和结构体是一样的 当C++类实例化的时候。就是会被计算个内存大小。只不过是C++类有些特性 继承 虚函数 多重继承 菱形继承等 这些额外增加了些内存。之后 把类中的成员数据存在那块内存。可以多学习C++汇编。
物理内存的分页 二级页表:一级页表映射4MB(2^22)、二级页表映射4KB,则需要1K个一级页表项(4GB / 4MB = 1K, 2^10个一级页表项)、每个一级页表项对应1K个二级页表项(4MB / 4KB = 1K),这样页表占用4.004MB(1K * 4B + 1K * 1K * 4B = 4.004MB)的内存空间。程序可以独享4GB的线性地址。对于4GB线性地址而言,每个页4KB,则总共可以分成1024*1024=1048576个页面。那么这地址是几位呢,也就是物理地址总线的长度,32位的就是 4个字节。
nullptr用法 是一种特殊的拷贝,利用的是C++11新引入的移动构造函数和移动赋值运算符性质。换言之,这不是拷贝,这是移动。再来看下右值引用的绑定问题,由于解引用操作符生成左值,取地址运算符生成右值,所以指针nullptr是一个右值,可以被绑定到unique_ptr的移动操作构造函数/移动赋值运算符上。首先,nullptr是C++11新标准下引入的一种特殊类型的字面值, 它可以被转换为任意其他的指针类型。其次:nullptr_t的定义看下:typedef decltype(nullptr) nullptr_t;
操作系统分页管理 比如4级页表 可能对应的页大小就G的大小。3级对应M 的大小 2级对应K 的大小。1级还是对应页内偏移,最终找到了实际的物理地址。之前总是不理解 多级页表查询机制。现在想 道理应该是这样的。分的级越多 也就对应页的大小就越大 也可以这么理解 至此。操作系统管理内存使用分页机制。每个页大小4K 这样进程在存储每一页的地址,在加上 页内偏移就能得到实际的物理地址。这个需要mmu 这个转换支持。
GCC 编译器常用选项 S 输出编译后的汇编代码文件 gcc a.c -o a.s -S。-c 输出链接后的可重定位文件 gcc a.c -o a.o -c。-E 输出预处理后的代码文件 gcc a.c -o a.i -E。-g 在编译结果中加入调试信息 gcc a.c -o a -g。-o 指定输出文件名 gcc a.c -o a。GCC 编译器常用选项。Linux 编程环境。