C++:并发保护 一、前言本文将会通过保护一个数据讨论:互斥锁、双重检查锁、 std::once_flag 类、 std::call_once() 函数、单例模式、使用局部静态变量实现单例模式等。 二、保护共享数据假设我们需要某个共享数据,而它创建起来开销不菲。因为创建它可能需要建立数据库连接或分配大量内存,所以等到必要时才真正着手创建。这种方式称为延迟初始化(lazy initialization),常见于 2024-05-14 C++ #c++
C++并发:锁 一、前言C++中的锁和同步原语的多样化选择使得程序员可以根据具体的线程和数据保护需求来选择最合适的工具。这些工具的正确使用可以大大提高程序的稳定性和性能,本文讨论了部分锁。 二、std::lock在C++中,std::lock 是一个用于一次性锁定两个或多个互斥量(mutexes)的函数,而且还保证不会发生死锁。这是通过采用一种称为“死锁避免算法”的技术来实现的,该技术能够保证多个互斥量按照一 2024-05-14 C++ #c++
C++:完美转发(二)(std::forward) 一、RVO优化和std::move、std::forward以下是一个综合性的例子: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 2024-05-12 C++ #c++
C++:完美转发(一)(std::forward) 一、理解引用折叠(一)引用折叠 1. 在C++中,“引用的引用”是非法的。像 auto& &rx = x;(注意两个&之间有空格)这种直接定义引用的引用是不合法的,但是编译器在通过类型别名或模板参数推导等语境中,会间接定义出“引用的引用”,这时引用会形成“折叠”。 2. 引用折叠会发生在模板实例化、auto类型推导、创建和运用typedef和别名声明、以及decl 2024-05-12 C++ #c++
C++:移动语义(std::move) 一、std::move(一)std::move 的原型123456 template<typename T> decltype(auto) move(T&& param) //注意,形参是个引用(万能引用){ using ReturnType = typename remove_reference<T>::type&&a 2024-05-11 C++ #c++
C++:左值(引用)&右值(引用) 〇、前言本文会讨论C++中的左值,右值,左值引用,右值引用,以及会理清它们之间的关系。 一、左值与右值(一)概述 1. 左值是一般指表达式结束后依然存在的持久化对象。右值指表达式结束时就不再存在的临时对象。便捷的判断方法:能对表达式取地址、有名字的对象为左值。反之,不能取地址、匿名的对象为右值。 2. C++ 表达式(运算符带上其操作数、字面量、变量名等)有两种独立的属性:类型和值类别 2024-05-10 C++ #c++
C++并发:线程函数传参(二) 正文传参中的陷阱 1. 向std::thread 构造函数传参:所有参数(含第1个参数可调用对象)均按值并以副本的形式保存在 std::thread 对象中的tuple里。这一点的实现类似于std::bind。如果要达到按引用传参的效果,可使用std::ref来传递。 2. 向线程函数的传参:由于std::thread 对象里保存的是参数的副本,为了效率同时兼顾一些只移动类型的对象,所有 2024-05-10 C++ #c++ #多线程
C++并发:线程函数传参(一) 一、问题当创建 std::thread 对象时,传递给线程的函数的所有参数都会被复制或移动到新创建的线程的内存空间中。这是为了确保线程的执行不会依赖于父线程可能销毁的栈上变量,从这个机制上看,这是很合理的。 在新的线程的栈上,这些变量都会以右值的方式传递给线程函数,这主要是为了提高传参的性能。但是在某些情况下,这些右值并不能满足线程函数的参数。如果线程函数需要引用参数,直接传递普通变量会因为无 2024-05-09 C++ #c++ #多线程
macOS DOSBox 汇编环境搭建 正文一、安装DOSBox首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包在用户目录下新建一个文件夹,比如 dosbox: 1mkdir dosbox 然后下载一些常用的工具。下载好了后,将这些工具解压,重新放在 dosbox 这个文件夹中: 三、配置自动挂载由于DOSBox启动之后所有的设置都会复原,因此要实现自动挂载需要配置自动运行命令。 打开Termin 2024-05-05 经验方法 > 8086 #汇编 #8086 #macos #DOSBox
CM3:lldb 调试 qemu 跑的程序 正文环境:macOS M1。QEMU可以通过启动一个GDB调试端口来允许使用GDB调试正在运行的虚拟机,我们要做的就是通过 gdb 或者 lldb 连接到这个端口,然后进行调试。我们先写一个简单的CM3 程序: 123456789101112131415161718192021 .equ STACK_TOP, 0x20000800 .text .global _start 2024-04-28 CM3 #汇编 #QEMU #CM3