主页

生产者消费者模型

简介 生产者消费者模型是一种多线程协调机制,用于解决多个线程间相互依赖的问题。其主要特征是: 有两个线程角色:生产者和消费者。 生产者仅执行产品的生产逻辑,消费者仅执行产品的消费逻辑。 生产者和消费者通过共享队列进行通信。 当队列为空时,消费者线程陷入等待;当队列为满时,生产者线程陷入等待。 实现生产者消费者模型的关键是处理队列的互斥访问和线程同步问题。一般的实现方式有: 使用 Condition 变量进行通知,配合 Mutex 锁保证互斥访问队列。 使用 Semaphore 信号量可以限制队列访问的线程数量。 使用 Monitor 对象封...

阅读更多

cpp17 新特性shared_mutex 读写锁

C++17引入了shared_mutex,可以实现读写锁 std::shared_mutex是C++17引入的一种共享互斥锁,它具有以下主要特征: 支持两种互斥的访问模式:独占(exclusive)和共享(shared)。 多个线程可以同时获得shared ownership,从而实现并发读。 但只能有一个线程可以获得exclusive ownership,从而对数据的修改是互斥的。 shared_mutex通过读写锁(shared_lock、unique_lock)进行访问控制。 std::shared_mutex适用于读多写少的场景,例如: std::shared_mutex mutex; // 写操作需要unique锁 void write_data() { ...

阅读更多

address saniter 的实现

引入 ASan是google提供的一个内存检测工具,(来自gpt3.5) ASan通过在编译时插入额外的代码来实现内存错误检测,并提供了相应的运行时库来捕获和报告错误。可以知道通过一下方式实现: 插桩:ASan使用编译器插桩技术,在编译时修改源代码,插入额外的代码。这些额外的代码用于跟踪内存分配、释放和访问操作,以及检测内存错误。 内存分配器:ASan使用自定义的内存分配器,用于跟踪分配的内存块,并在每个内存块之前和之后添加红区(redzone)。红区是一段未分配的内存,用于检测缓冲区溢出。 彩色标记:ASan使用彩色标记技术,将分配的内存块分为不同的颜色,并将颜色信息存储在内存块的元数据中。这样,在访问内存时,ASan可以根...

阅读更多

c++ 计时器(支持多线程)

本项目能够对指定代码块或函数等进行计时,并利用Chrome tracing进行可视化 将InstrumentorTimer.h和InstrumentorMacro.h(可选的,一些宏定义)正确引入后。 Instrumentor::BeginSession("SessionName"); // Begin session { InstrumentationTimer timer("Profiled Scope Name"); // Place code like this in scopes you'd like to include in profiling // Code Blocks // timer.Stop(); ...

阅读更多

c++ shared_ptr 底层实现及线程安全相关

std::shared_ptr 是 ,用于管理动态分配的对象。它提供了引用计数的机制,允许多个 shared_ptr 共享同一个对象,并在不再需要时自动释放对象。 底层实现: std::shared_ptr 的底层实现通常使用两个部分:一个控制块(control block)和一个指向实际对象的指针。控制块通常包含引用计数、指向对象的指针以及其他辅助信息。当创建一个 shared_ptr 对象时,控制块会被动态分配,并将引用计数初始化为 1。每当有一个新的 shared_ptr 对象指向相同的对象时,引用计数就会增加。当引用计数减少到零时,控制块会负责释放对象的内存。 线程安全性: std::shared_ptr 的默认实现在引用计数的增加和减少操作上是线程安全的。这意味着多个线程...

阅读更多

银行家算法

简介 银行家算法是操作系统的经典算法之一,用于避免死锁情况的出现。 它最初是为银行设计的(因此得名),通过判断借贷是否安全,然后决定借不借。 参考 https://www.zhihu.com/tardis/zm/art/384678500?source_id=1003

阅读更多