lambda再探
有一部分在第四章的讲解里面,我再单独为lambda开一章,因为发现这里也有很多可以讲的 ✅ Lambda 捕获的本质 lambda 捕获是把外部作用域的变量复制进 lambda 的闭包对象(closure object)里。 你可以把 lambda 看成一个“生成临时类的语法糖”: 1auto f = [x]() { return x + 1; }; 其实等价于生成一个类: 1234struct __Lambda { int x; // 捕获变量 int operator()() { return x + 1; }}; ✅ 一、按值捕获 [x]含义: 把外部变量 拷贝 一份到 lambda 内部。 例子: 1234int a = 10;auto f = [a]() { return a; };a = 20;cout << f(); // 输出 10 📌 特点: captured 值不会随外面变化 内部只看到“值的快照” ...
《C++-Concurrency-in-Action》第四章
碎碎念:接下来的一两周就是考试面试考试面试了,前段时间好不容易说服自己专心搞量化,wlb才是该追求的东西,但是京东的一个面试邀约直接打乱了计划。还是想去互联网刷一段实习,去去魅,毕竟如果秋招去量化的话,社招大概率也去不了互联网了。 努努力准备一下吧,算法,八股,项目,今天下午再看一下dp是怎么回事,重点刷一下,我还是太摆烂了,自己定下的目标很少能完成。 ———————————————————————————————————— 本书的第四章是同步条件,重点讲的是condition_varible条件变量和future,这里重点讲一下future,并以线程池为例子,第四章后半部分的东西过于小众,我们就略过不讲。 cv这个我们常用的条件变量,会存在一个伪唤醒的情况,即cv.wait()的条件明明没有真正准备好,但就被唤醒了(这让我想到了cas_weak) 伪唤醒 指的是:一个正在条件变量上等待的线程,在没有其他线程显式地通知(signal 或 broadcast)它的情况下,自己从等待状态(如 pthread_cond_wait 或...
TSDB-TDengine
碎碎念:前两天做了顽岩的笔试,美美收到了拒绝信,只能说百亿级别的量化开发还是对acm✌太喜爱了,菜鸡没有活路。 emo了半天,然后最近去刷了两天力扣,感觉自己比前段时间的算法能力有一点提升的,虽然不多就是了,努努力多刷点hard难度吧只能说。 今天mentor提到了时序内存数据库,是没有听说过的东西,就去搜了搜,水一条博客,表示自己还活着。 —————————————————————————————————————————————————————— 本文将分为以下几个核心部分,层层递进,为您全方位解构 TDengine: 第一部分:核心设计理念——重塑时序数据处理的基石 理念一:“一个采集点一张表” (One Table for One Device) 理念二:“数据驱动与化整为零” (Data-Driven & Divide and Conquer) 理念三:“内置核心功能,一体化解决” (All-in-One...
线程池中的意外发现
本来我在认真学习bind和function的区别 1. std::bind 的作用std::bind 的作用是将函数和其参数绑定在一起,返回一个可调用对象。当你调用这个对象时,已经绑定好的函数和参数会被执行。 举个例子: 123456789101112#include <iostream>#include <functional>void add(int a, int b) { std::cout << "Sum: " << a + b << std::endl;}int main() { // 使用 bind 绑定 add 函数和参数 auto bound_func = std::bind(add, 3, 4); bound_func(); // 执行 add(3, 4)} 在这个例子中,std::bind 将 add 函数与参数 3 和 4 绑定,返回的 bound_func 是一个可调用对象,调用时就相当于执行了 add(3,...
《C++ Concurrency in Action》第三章
这本书主要讲的是c++多线程编程相关的内容,第三章是锁的盛宴 在多线程的情况下,共享数据的读写是个大问题,很容易出现a在读时b在写,导致错误,即条件竞争 而最常见的解决办法就是互斥量(mutex) 123456std::mutex只是互斥量,我们需要利用这个互斥量解决条件竞争,就需要用锁mutex本身自带lock和unlock两个成员函数,可以进行上锁但是显然这很麻烦,c++特性了属于是,很可能忘记解锁那么RAII就登场了,std::lock_guard<std::mutex>guard(mutex)是最常见的互斥锁使用方法但是在c++17中,引入了模板类参数推导的特性,允许在定义std::mutex之后直接使用std::lock_guard guard(mutex)即可上锁,越出作用域之后自动释放。 在有不止一个锁的时候,正常我们是先加a锁,然后加b锁,但是因为有先后顺序,那么在多线程情况下,a锁加上后,如果b锁被另一个程序抢走,且另一个程序试图加b锁,就会出现最经典的死锁情况 123456789101112131415std::unique_lock...
《C++ Concurrency in Action》第二章
这本书主要讲的是c++多线程编程相关的内容,第二章主要讲的是std:thread的使用注意事项 线程的启动在使用std:thread时,我们要注意的一点是c++中的语法解析,原文是(c++’s most vexing parse). 函数对象(Functors)即任何重载了 operator() 的类的实例。Lambda 表达式是匿名函数对象的语法糖 如果将函数对象作为thread的构造函数参数而不是普通的函数对象,就注意不要使用临时变量 123456789struct fun { void operator()() { std::cout << "MyFunctor is running in a thread!" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "MyFunctor finished." <<...
c中的协程(三)
在 C++20 中,协程由多个部分组成,其中 等待体、协程体 和 promise_type 是关键组成部分。它们各自负责协程的不同方面,密切配合,共同完成协程的生命周期管理、执行与返回值的处理。 关系概述: 协程体(Coroutine Body)是我们定义的协程函数,即用户定义的异步操作逻辑,通常包含 co_await、co_yield 和 co_return 等操作。 等待体(Awaitable)是协程体中通过 co_await 关键字进行挂起的对象。它定义了协程如何挂起并等待某些异步操作的完成。 promise_type 是协程的内部管理对象,负责协程的生命周期,包括挂起、恢复、返回值以及异常的处理。每个协程都会有一个与之关联的 promise_type,它控制协程体的行为和返回值的处理。 它们的具体关系: 协程体 会依赖 promise_type 来控制协程的执行和返回值。 promise_type 负责管理协程的状态,包括决定何时挂起和恢复协程,以及处理协程的返回值。 等待体 是协程体中通过 co_await...
c中的协程(二)
栈协程(Stackful Coroutine)和无栈协程(Stackless Coroutine)的底层原理和实现方式有很大的区别,特别是在如何管理协程的执行状态、内存和栈的分配上。它们分别采用不同的策略来实现协程的暂停与恢复,以下是它们的具体实现方式、区别和底层原理的详细解析。 1. 栈协程(Stackful Coroutine)栈协程的基本原理是为每个协程分配一个独立的栈空间。栈空间用于保存协程的局部变量、函数调用的状态(比如返回地址、参数、局部数据)以及执行的上下文。当协程暂停时,整个栈内容(包括程序计数器、寄存器等)都会被保存;当协程恢复时,这些状态会被恢复,栈继续执行。 栈协程的实现方式:栈协程的底层实现一般需要依赖操作系统提供的线程或者使用一些低级的上下文切换机制,常见的有: 使用线程:栈协程的实现有时会通过操作系统的线程来模拟。每个协程有独立的栈和线程上下文,操作系统调度器负责协程的切换。 例子: boost::context 或 libco 等库,使用 setjmp 和 longjmp 来保存和恢复栈状态,或者使用线程来模拟协程。 **使用 setjmp...
Rangers库
好的,我们来详细聊聊 C++20 引入的 Ranges 库。 Ranges 库是 C++20 中一个非常重要的特性,它彻底改变了我们在 C++ 中处理序列(集合、容器)的方式。它的核心思想是提供一种组合式 (composable)、声明式 (declarative)、惰性求值 (lazy evaluation) 的方式来操作数据序列,从而使得代码更简洁、更易读、更安全、更高效。 1. 为什么需要 Ranges 库?在 C++20 之前,我们主要使用标准库算法(如 std::for_each, std::transform, std::sort 等)配合迭代器对来操作序列: 1234567891011121314151617181920212223242526272829303132#include <vector>#include <algorithm> // for std::transform, std::for_each#include <iostream>#include <numeric> // for...
concepts
在 C++20 中,”约束” (Constraints) 主要指的是 **概念 (Concepts)**。它是 C++ 模板编程中的一个革命性特性,旨在解决传统模板编程中的一些核心痛点。 简单来说,概念 (Concept) 允许你指定模板参数必须满足的条件或要求。 1. 为什么需要概念 (Concepts)?在 C++20 之前,我们编写泛型代码(模板)时,编译器通常只在实例化模板时才检查模板参数是否“合适”。如果参数不合适,就会导致非常冗长、难以理解的编译错误信息,这被称为 SFINAE (Substitution Failure Is Not An Error) 的副作用。 考虑一个简单的例子: 1234567891011121314// C++11/14/17template <typename T>void print_sum(T a, T b) { std::cout << a + b << std::endl;}int main() { print_sum(1, 2); // OK ...


