本文作者:icy

Cplusplus-Concurrency-In-Practice:现代 C++ 并发编程实践指南

icy 今天 2 抢沙发
Cplusplus-Concurrency-In-Practice:现代 C++ 并发编程实践指南摘要: Cplusplus-Concurrency-In-Practice:现代 C++ 并发编程实践指南 项目概述 Cplusplus-Concurrency-In-Practice 是...

Cplusplus-Concurrency-In-Practice:现代 C++ 并发编程实践指南

Cplusplus-Concurrency-In-Practice:现代 C++ 并发编程实践指南

项目概述

Cplusplus-Concurrency-In-Practice 是一个专注于现代 C++ 并发编程的开源学习项目,由开发者 forhappy 创建并维护。该项目旨在为 C++ 开发者提供一套全面、实用的并发编程学习资源和实践示例,涵盖了从基础概念到高级技术的完整知识体系。

项目地址:https://github.com/forhappy/Cplusplus-Concurrency-In-Practice

核心特性

1. 全面的知识覆盖

该项目系统性地整理了 C++11/14/17/20 标准中引入的并发编程特性,包括: - 线程管理(std::thread) - 互斥锁与同步机制(std::mutex, std::lock_guard, std::unique_lock) - 条件变量(std::condition_variable) - 原子操作(std::atomic) - 异步编程(std::async, std::future, std::promise) - 内存模型与内存顺序

2. 实践导向的代码示例

项目提供了大量可直接运行的代码示例,每个示例都配有详细的注释说明,帮助开发者理解并发编程的实际应用场景。

3. 常见并发模式实现

包含了生产者-消费者模式、读写锁模式、线程池等常见并发设计模式的实现。

实用示例

示例 1:基础线程创建与管理

text
#include <iostream>
#include <thread>
#include <vector>

void worker(int id) {
    std::cout << "Thread " << id << " is working..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Thread " << id << " finished." << std::endl;
}

int main() {
    std::vector<std::thread> threads;
    
    // 创建多个线程
    for (int i = 0; i < 5; ++i) {
        threads.emplace_back(worker, i);
    }
    
    // 等待所有线程完成
    for (auto& t : threads) {
        t.join();
    }
    
    std::cout << "All threads completed." << std::endl;
    return 0;
}

示例 2:使用互斥锁保护共享数据

text
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

std::mutex mtx;
int shared_counter = 0;

void increment_counter(int id) {
    for (int i = 0; i < 1000; ++i) {
        // 使用 lock_guard 自动管理锁
        std::lock_guard<std::mutex> lock(mtx);
        ++shared_counter;
    }
    std::cout << "Thread " << id << " finished." << std::endl;
}

int main() {
    std::vector<std::thread> threads;
    
    // 创建 10 个线程同时增加计数器
    for (int i = 0; i < 10; ++i) {
        threads.emplace_back(increment_counter, i);
    }
    
    for (auto& t : threads) {
        t.join();
    }
    
    std::cout << "Final counter value: " << shared_counter << std::endl;
    return 0;
}

示例 3:生产者-消费者模式实现

text
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <chrono>

template<typename T>
class ThreadSafeQueue {
private:
    std::queue<T> queue_;
    mutable std::mutex mutex_;
    std::condition_variable cond_;
    
public:
    void push(T value) {
        std::lock_guard<std::mutex> lock(mutex_);
        queue_.push(std::move(value));
        cond_.notify_one();
    }
    
    bool try_pop(T& value) {
        std::lock_guard<std::mutex> lock(mutex_);
        if (queue_.empty()) {
            return false;
        }
        value = std::move(queue_.front());
        queue_.pop();
        return true;
    }
    
    void wait_and_pop(T& value) {
        std::unique_lock<std::mutex> lock(mutex_);
        cond_.wait(lock, [this] { return !queue_.empty(); });
        value = std::move(queue_.front());
        queue_.pop();
    }
    
    bool empty() const {
        std::lock_guard<std::mutex> lock(mutex_);
        return queue_.empty();
    }
};

void producer(ThreadSafeQueue<int>& queue, int id) {
    for (int i = 0; i < 5; ++i) {
        int value = id * 100 + i;
        queue.push(value);
        std::cout << "Producer " << id << " produced: " << value << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void consumer(ThreadSafeQueue<int>& queue, int id) {
    for (int i = 0; i < 3; ++i) {
        int value;
        queue.wait_and_pop(value);
        std::cout << "Consumer " << id << " consumed: " << value << std::endl;
    }
}

int main() {
    ThreadSafeQueue<int> queue;
    
    // 创建生产者和消费者线程
    std::vector<std::thread> producers;
    std::vector<std::thread> consumers;
    
    for (int i = 0; i < 2; ++i) {
        producers.emplace_back(producer, std::ref(queue), i);
    }
    
    for (int i = 0; i < 3; ++i) {
        consumers.emplace_back(consumer, std::ref(queue), i);
    }
    
    // 等待所有线程完成
    for (auto& t : producers) {
        t.join();
    }
    
    for (auto& t : consumers) {
        t.join();
    }
    
    return 0;
}

项目结构

Cplusplus-Concurrency-In-Practice 项目通常包含以下目录结构:

text
├── basics/          # 基础并发概念
├── synchronization/ # 同步机制
├── atomic/         # 原子操作
├── async/          # 异步编程
├── patterns/       # 并发模式
├── memory_model/   # 内存模型
└── examples/       # 综合示例

学习路径建议

  1. 初学者:从 basics 目录开始,理解线程的基本概念和创建方式
  2. 中级开发者:学习 synchronization 和 atomic 目录,掌握数据同步和原子操作
  3. 高级开发者:研究 memory_model 和 patterns 目录,深入理解内存模型和设计模式
  4. 实践应用:参考 examples 目录中的综合示例,将所学知识应用到实际项目中

总结

Cplusplus-Concurrency-In-Practice 是一个优秀的 C++ 并发编程学习资源,它通过系统的知识整理和丰富的实践示例,帮助开发者掌握现代 C++ 并发编程的核心技术。无论是并发编程的初学者还是有经验的开发者,都能从这个项目中获得有价值的知识和实践经验。

项目的代码示例清晰易懂,注释详细,非常适合作为学习和参考的资料。建议对 C++ 并发编程感兴趣的开发者收藏这个项目,并结合实际项目需求进行学习和实践。

Cplusplus-Concurrency-In-Practice_20260204004346.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/2026/03/280.html发布于 今天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,2人围观)参与讨论

还没有评论,来说两句吧...