C++并发编程基础与实践

44 阅读13分钟

一、引言

随着多核处理器的普及,并发编程成为提升程序性能的关键技术。C++自C++11起,标准库正式支持多线程及并发编程,提供了丰富的线程管理和同步机制。

本文将系统介绍C++并发编程的基础概念、线程创建与管理、同步机制及实战应用,帮助你掌握现代C++并发开发技巧。

二、线程基础

1. 线程的概念

线程是进程中的执行单元,多线程允许同时执行多条指令流,提高CPU利用率。

2. C++11线程库

std::thread是C++11标准的线程类,用于创建和管理线程。

cpp复制编辑#include <thread>
#include <iostream>

void func() {
    std::cout << "线程执行中\n";
}

int main() {
    std::thread t(func);
    t.join();  // 等待线程结束
    return 0;
}

三、线程管理

1. 创建与启动线程

可传递参数与函数对象:

cpp复制编辑void printNum(int n) {
    std::cout << "数字: " << n << "\n";
}

std::thread t(printNum, 42);
t.join();

2. 线程分离

detach()使线程独立执行,主线程不等待。

cpp复制编辑t.detach();

注意:detach后线程生命周期由操作系统管理,须避免资源竞争。

四、线程同步

并发程序中,多线程访问共享资源需同步,避免数据竞争。

1. 互斥锁(mutex)

std::mutex用于保护临界区:

cpp复制编辑#include <mutex>

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx);
    ++counter;
}

lock_guard自动加锁解锁,异常安全。

2. 读写锁(shared_mutex)

允许多个读者共享访问,写者独占。

3. 条件变量(condition_variable)

线程间等待和通知机制:

cpp复制编辑std::condition_variable cv;
std::mutex mtx;
bool ready = false;

void waitForReady() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; });
    std::cout << "准备好了\n";
}

void setReady() {
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_one();
}

五、原子操作

std::atomic支持无锁编程,保证单个变量操作的原子性。

cpp复制编辑#include <atomic>

std::atomic<int> atomicCounter(0);

void increment() {
    atomicCounter.fetch_add(1, std::memory_order_relaxed);
}

六、线程局部存储(Thread Local Storage)

每线程拥有独立变量实例,避免竞争。

cpp复制编辑thread_local int localVar = 0;

七、实战示例:多线程计算数组元素和

cpp复制编辑#include <iostream>
#include <vector>
#include <thread>

void partialSum(const std::vector<int>& data, size_t start, size_t end, int& result) {
    result = 0;
    for (size_t i = start; i < end; ++i) {
        result += data[i];
    }
}

int main() {
    std::vector<int> data(1000000, 1);

    int result1 = 0, result2 = 0;
    size_t mid = data.size() / 2;

    std::thread t1(partialSum, std::ref(data), 0, mid, std::ref(result1));
    std::thread t2(partialSum, std::ref(data), mid, data.size(), std::ref(result2));

    t1.join();
    t2.join();

    int total = result1 + result2;
    std::cout << "总和: " << total << "\n";

    return 0;
}

八、并发编程中的挑战

  • 死锁:多个线程互相等待对方释放资源。

  • 活锁:线程频繁让步,无法继续执行。

  • 资源竞争:未同步访问共享数据导致不确定行为。

九、总结

C++并发编程使程序能充分利用多核硬件,提升性能。掌握线程管理、同步机制和原子操作,是写出高效稳定并发程序的关键。

来源:页面平台入口

来源:外链跳转通道

来源:页面参考入口

来源:入口跳转页

来源:引导文献页

来源:数据查阅页

来源:页面通道入口

来源:可跳转平台

来源:实时外链路径

来源:链接外部资源

来源:页面起始链接

来源:参考网页内容

来源:网页内容跳转

来源:文章延伸页

来源:内容查找入口

来源:引导跳转信息

来源:跳转资源页

来源:站外资源查看

来源:资料原始链接

来源:文献通道入口

来源:推荐访问链接

来源:文章外跳入口

来源:页面数据通道

来源:可跳转信息页

来源:路径入口说明

来源:页面源文档

来源:数据延伸链接

来源:页面原路径

来源:引用说明入口

来源:跳转路径源

来源:页面说明内容

来源:页面通行地址

来源:数据查阅地址

来源:可参考原页

来源:页面说明文章

来源:内容路径推荐

来源:跳转资源页面

来源:引导页面信息

来源:页面参考导向

来源:入口跳转说明

来源:文档浏览地址

来源:页面跳转说明

来源:页面内容详情

来源:内容外部路径

来源:网页原文说明

来源:内容查找页

来源:平台外链资源

来源:文献平台入口

来源:路径导航链接

来源:页面跳出内容

来源:外链导向页

来源:网页导航资源

来源:原始资料页面

来源:信息页面链接

来源:内容导向路径

来源:页面指引地址

来源:路径查看入口

来源:内容查阅地址

来源:页面推荐资源

来源:网页地址跳转

来源:原始入口说明

来源:路径说明页面

来源:入口信息地址

来源:页面通道资源

来源:可跳转文献

来源:实用页面链接

来源:页面内容引导

来源:页面引导跳转

来源:跳转页面推荐

来源:参考链接导航

来源:页面外链内容

来源:可阅读内容页

来源:页面推荐信息

来源:页面延伸内容

来源:内容站外链接

来源:页面站外跳转

来源:页面参考信息

来源:页面外跳路径

来源:文档跳转说明

来源:网页推荐跳转

来源:原始资料路径

来源:内容路径跳转

来源:页面内容通道

来源:路径内容浏览

来源:页面内容起点

来源:页面说明路径

来源:文章平台入口

来源:页面数据查阅

来源:页面数据来源

来源:文档通道

来源:路径文章

来源:了解详情页

来源:访问详情

来源:资料跳转页

来源:了解入口

来源:资源数据

来源:链接原文

来源:访问原文

来源:原始通道

来源:内容地址

来源:页面内容

来源:引用资料

来源:阅读路径

来源:跳转入口

来源:说明平台

来源:原文页面

来源:数据说明

来源:内容入口

来源:资料源头

来源:平台通道

来源:路径平台

来源:信息源头

来源:页面导向

来源:说明页面

来源:原文内容

来源:跳转内容

来源:地址详情

来源:资源详情

来源:入口参考

来源:浏览页面

来源:源地址页

来源:页面参考

来源:引导详情

来源:资料平台

来源:内容原始

来源:引用路径

来源:阅读详情

来源:入口路径

来源:通道信息

来源:说明资源

来源:地址内容

来源:引导入口

来源:链接资料

来源:入口文档

来源:访问资源

来源:数据页面

来源:地址资料

来源:文档参考

来源:通道资源

来源:了解数据

来源:路径数据

来源:信息参考

来源:导向页面

来源:源平台页

来源:参考资源

来源:内容引导

来源:页面文档

来源:资料内容

来源:内容数据

来源:了解页面

来源:平台路径

来源:页面入口

来源:路径入口

来源:地址入口

来源:链接说明

来源:引用信息

来源:页面说明

来源:导向路径

来源:跳转文档

来源:通道详情

来源:数据导向

来源:原文平台

来源:引导文档

来源:页面来源

来源:资源通道

来源:通道导向

来源:信息页面

来源:链接数据

来源:平台详情

来源:源头信息

来源:地址参考

来源:跳转条目

来源:索引内容

来源:详细跳转页

来源:获取跳转

来源:导航信息

来源:内容数据页

来源:更多条目

来源:参考来源

来源:访问条目

来源:文章详情页

来源:文稿内容

来源:参考渠道

来源:页面链接

来源:内容资源

来源:获取入口

来源:详情数据

来源:文章出处

来源:参考信息

来源:资源内容

来源:说明通道

来源:入口内容

来源:信息页跳转

来源:链接内容

来源:文档渠道

来源:内容说明

来源:文章获取

来源:详情跳转

来源:资料通道

来源:页面获取

来源:信息数据

来源:信息内容

来源:文档页

来源:资料页

来源:数据详情

来源:渠道文档

来源:浏览资源

来源:详情资源

来源:链接渠道

来源:资源获取

来源:出处入口

来源:文档路径

来源:参考详情

来源:阅读入口

来源:文段通道

来源:文页信息

来源:文稿资源

来源:文章数据

来源:资源页

来源:参考条目

来源:访问页面

来源:资料页跳转

来源:参考出处

来源:信息源

来源:原始资料

来源:相关内容

来源:参考路径

来源:了解文档

来源:资料通道页

来源:文章索引

来源:浏览条目

来源:说明信息

来源:文章文档

来源:阅读资料

来源:条目信息

来源:展示内容

来源:入口通道

来源:文稿页

来源:条目跳转

来源:信息页链接

来源:访问内容

来源:参考页面

来源:内容素材

来源:文档条目

来源:路径说明

来源:资源来源

来源:展示页面

来源:资源链接

来源:内容段落

来源:入口来源

来源:信息获取

来源:资源入口

来源:条目内容

来源:文章渠道

来源:入口跳转

来源:资源文稿

来源:资料索引

来源:获取详情

来源:数据源

来源:渠道入口

来源:资料数据

来源:资源片段

来源:资料展示

来源:内容文章

来源:内容段

来源:条目展示

来源:文段入口

来源:素材链接

来源:条目资源

来源:详情入口

来源:素材内容

来源:段落入口

来源:入口条目

来源:链接渠道页

来源:数据详情页

来源:文页通道

来源:文档原文

来源:原文页

来源:文稿入口

来源:资源数据页

来源:条目文献

来源:段落链接

来源:信息片段

来源:信息展示

来源:详情页面

来源:源文入口

来源:语段入口

来源:资源页面

来源:参考链接

来源:数据片段

来源:片段详情

来源:入口数据

来源:访问路径

来源:数据展示

来源:段落数据

来源:参考信息页

来源:信息源页

来源:条目索引

来源:条目片段

来源:索引入口

来源:路径内容

来源:素材页面

来源:路径详情

来源:资源说明页

来源:文稿详情

来源:文档信息

来源:链接信息

来源:获取数据

来源:参考数据

来源:访问展示

来源:入口展示

来源:访问素材

来源:入口文页

来源:参考段落

来源:内容库

来源:素材页

来源:素材数据

来源:语料内容

来源:跳转素材

来源:资料库

来源:文库链接

来源:渠道内容

来源:渠道说明

来源:展示页

来源:访问素材页

来源:素材入口

来源:文档链接

来源:数据通道

来源:信息路径

来源:素材展示

来源:文稿展示

来源:内容渠道

来源:文段展示

来源:素材说明

来源:素材展示页

来源:资源通道页

来源:路径资源

来源:获取原文

来源:索引内容页

来源:信息入口页

来源:资源页跳转

来源:内容链接页

来源:资源展示页

来源:信息展示页

来源:资料路径

来源:获取文章

来源:内容参考页

来源:文章跳转页

来源:素材入口页

来源:文档展示页

来源:渠道跳转页

来源:数据资源页

来源:段落展示页

来源:语段展示页

来源:跳转资料页

来源:入口信息页

来源:展示资源页

来源:资源路径

来源:片段展示页

来源:资料展示页

来源:内容说明页

来源:数据页链接

来源:链接资料页

来源:展示内容页

来源:通道入口页

来源:原文展示页

来源:数据链接页

来源:内容链接通道

来源:内容展示页

来源:跳转信息页

来源:说明内容页

来源:文章展示页

来源:素材链接页

来源:参考展示页

来源:信息跳转页

来源:渠道链接页

来源:详情展示页

来源:展示文档页

来源:信息数据页

来源:素材数据页

来源:片段链接页

来源:资料跳转通道

来源:展示文稿页

来源:信息渠道页

来源:渠道数据页

来源:条目展示页

来源:文库入口页

来源:数据说明页

来源:内容跳转页

来源:资料浏览

来源:内容索引

来源:路径页面

来源:资源概览

来源:参考素材

来源:文章链接

来源:原始文段

来源:文库索引

来源:资料路径页

来源:内容引用

来源:资源文段

来源:跳转资料

来源:链接入口页

来源:资料内容页

来源:文档访问

来源:资料详情页

来源:文库页面

来源:内容入口页

来源:段落资源

来源:条目链接

来源:内容详情页

来源:入口文库

来源:素材文段

来源:片段页面

来源:段落素材

来源:素材参考

来源:链接条目页

来源:文章内容页

来源:展示信息页

来源:参考段落页

来源:原始片段

来源:片段入口页

来源:文段链接页

来源:数据引用

来源:数据参考页

来源:原始内容页

来源:资源引用

来源:链接参考页

来源:资料引用

来源:入口索引页

来源:资源参考页

来源:展示入口页

来源:跳转链接页

来源:详情路径页

来源:路径通道页

来源:说明链接页

来源:索引文段

来源:入口文段

来源:内容引用页

来源:资源访问页

来源:访问详情页

来源:资料详情信息

来源:段落条目页

来源:说明通道页

来源:文章片段页

来源:展示索引页

来源:内容资源页

来源:资源页通道

来源:跳转索引页

来源:获取链接

来源:链接获取页

来源:访问详情页

来源:资料详情信息

来源:段落条目页

来源:说明通道页

来源:文章片段页

来源:展示索引页

来源:内容资源页

来源:资源页通道

来源:跳转索引页

来源:获取链接

来源:链接获取页

来源:访问详情页

来源:资料详情信息

来源:段落条目页

来源:说明通道页

来源:文章片段页

来源:展示索引页

来源:内容资源页

来源:资源页通道

来源:跳转索引页

来源:获取链接

来源:链接获取页

来源:访问详情页

来源:资料详情信息

来源:段落条目页

来源:说明通道页

来源:文章片段页

来源:展示索引页

来源:内容资源页

来源:资源页通道

来源:跳转索引页

来源:获取链接

来源:链接获取页

来源:访问详情页

来源:资料详情信息

来源:段落条目页

来源:说明通道页

来源:文章片段页

来源:展示索引页

来源:内容资源页

来源:资源页通道

来源:跳转索引页

来源:获取链接