- [重磅项目](#重磅项目)
  - [学习方式](#学习方式)
  - [HOT: 新增项目](#hot-新增项目)
    - [线程池](#线程池)
    - [内存池](#内存池)
  - [手把手100行写一个简易版Mutex](#手把手100行写一个简易版mutex)
    - [内容](#内容)
    - [涉及内容](#涉及内容)
  - [七种方式玩转condition\_variable](#七种方式玩转condition_variable)
    - [内容](#内容-1)
    - [涉及内容](#涉及内容-1)
  - [duckdb + levledb](#duckdb--levledb)
  - [C++那些事十日狂练升级版](#c那些事十日狂练升级版)


# 重磅项目

## 学习方式

深入学习以下项目，可扫码加入知识星球或添加个人wx: **gcxzhang**，备注: 加入星球


<img src="../img/cpp.jpg" alt="知识星球" width="400" height="300">


## HOT: 新增项目

### 线程池

手把手教会该线程池，可以戳这里，附：视频+文字教程，包会。

https://mp.weixin.qq.com/s/ceQoyHVMVmaXL3BNt25O4g

这个项目的线程池是基于Apache Arrow项目的衍生版本。我们将Arrow项目中复杂的核心结构——线程池——完全剥离出来，形成了这个独立的项目。由于原>始的线程池与Arrow项目本身的工具有深度依赖关系，因此我们在这个项目中对线程池进行了一些深度移除和改造，以保持与原始Arrow线程池的基础功能
一致。一些改动包括：

- 将Arrow的Future替换为std::future
- 将Arrow的Result替换为std::optional
- 重构了Submit接口，使用promise进行实现

通过这些改动，我们的目标是：

- 使线程池更方便地作为其他项目的依赖库使用
- 提供简单的方式来引入本项目的so库和头文件，以使用线程池功能

此外，这个项目还可以作为深入学习线程池设计与实现的资源。我们欢迎您探索并使用这个经过精心改进的线程池。

[线程池-飞书文档](https://hmpy6adnp5.feishu.cn/docx/BEKBdq0egoxmxNx3X3ZcHzkUnwd)


## 手把手100行写一个简易版Mutex
### 内容

项目名称：简易互斥锁（SimpleMutex）

项目描述：简易互斥锁（SimpleMutex）是一个基于原子变量和信号量的互斥锁实现，用于保护并管理多线程环境下的共享资源访问。它提供了一种简单而有效的方式来确保在多线程并发访问时，只有一个线程可以同时访问受保护的资源，从而避免数据竞争和不一致性。基于 POSIX 标准的信号量库实现，包含 Catch2 单元测试，附带了基于 Catch2 框架的单元测试，用于验证互斥锁的正确性和稳定性，使用bazel编译，google编码规范。

[https://mp.weixin.qq.com/s/SqtdadmCaJNSK10fScFlUw](https://mp.weixin.qq.com/s/SqtdadmCaJNSK10fScFlUw)


### 涉及内容

其中涉及C++知识（RAII、信号量、lock_guard、线程安全编程），还能学习以下内容：

1.Bazel构建系统：了解如何使用Bazel来管理和构建C++项目。Bazel是一种高效、可扩展的构建工具，可用于管理复杂的项目结构、依赖关系和构建流程。

2.Catch2测试框架：掌握如何使用Catch2来编写单元测试。Catch2是一个功能强大且易于使用的C++测试框架，可以帮助你编写清晰、可读性高的测试用例，提高代码质量和可靠性。

3.原子操作：了解原子操作的概念和使用方法。原子操作是一种并发编程技术，可以确保对共享变量的操作是不可中断的，避免了竞态条件和数据不一致的问题。

4.fetch_add函数：学习如何使用fetch_add函数进行原子的加法操作。fetch_add是一种原子操作函数，它可以在并发环境中安全地对共享变量进行原子加法操作，避免了数据竞争。

5.内存序：了解不同的内存序（memory order）对多线程程序的影响。

6.锁的自动管理：引入lock_guard类，实现锁的自动获取和释放。lock_guard是C++标准库提供的一种锁管理工具，它在构造函数中获取锁，在析构函数中释放锁，确保在任何情况下都能正确释放锁，避免因为异常或早期返回等情况导致锁没有释放的问题。

7.RAII（Resource Acquisition Is Initialization）原则：了解如何使用对象的生命周期来管理资源的获取和释放，确保资源的正确获取和释放，避免资源泄漏。

## 七种方式玩转condition_variable

[https://mp.weixin.qq.com/s/33ZXOA-tzhbBKMFWS26kCw](https://mp.weixin.qq.com/s/33ZXOA-tzhbBKMFWS26kCw)

### 内容

1.CPU轮询等待版单生产者单消费者：

该版本使用了简单的轮询机制，生产者不断地检查消费者是否已经消费完数据。这种模式简单直接，但效率较低，因为生产者在没有数据时仍然在忙等待。

2.等待通知版单生产者单消费者：

该版本引入了等待通知机制，生产者在没有数据时会等待消费者的通知。这种模式避免了忙等待，提高了效率，同时减少了资源消耗。

3.等待通知版单生产者多消费者：

在这个版本中，引入了多个消费者，它们共享生产者的数据。生产者在产生数据后，通知所有消费者进行处理。

4.等待通知版多生产者多消费者：

这个版本支持多个生产者和多个消费者，生产者之间和消费者之间共享数据。生产者在产生数据后，通知所有消费者进行处理。

5.单生产者多消费者并行版：

在这个版本中，引入了并行处理机制，多个消费者可以同时处理数据。生产者产生数据后，多个消费者并行处理，提高了整体处理速度。

6.多生产者多消费者并行版：

这个版本支持多个生产者和多个消费者，并且允许并行处理。多个生产者并行产生数据，多个消费者并行处理数据，提高了整体并发能力。

7.支持Lambda回调的优雅停止版：

在这个版本中，引入了Lambda回调函数，用于优雅地停止并发处理。可以通过调用回调函数来停止生产者和消费者的处理，并进行清理工作。

### 涉及内容

1.多线程和并发编程：通过这些版本的描述，您可以了解到如何在C++中使用多线程和并发编程来处理并行任务。您将学习如何创建线程、控制线程的执行、线程间的数据共享和同步等。

2.同步机制：在这些版本中，介绍了不同的同步机制，如轮询等待、等待通知和回调函数。您将学习如何使用互斥锁、条件变量、信号量等来实现线程间的同步和协调。

3.Lambda表达式：在支持Lambda回调的版本中，您将学习如何使用C++11引入的Lambda表达式来编写简洁而灵活的回调函数，以实现优雅的停止机制。

4.代码组织和构建工具：提到了支持bazel编译的能力，这可以让您学习如何使用构建工具来组织和管理复杂的C++项目。

5.condition_variable、mutex、unique_lock

## duckdb + levledb

leveldb 源码剖析已更毕

duckdb 持续更新

## C++那些事十日狂练升级版

已更毕
