跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 多线程概述
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++多线程概述 = '''多线程'''是现代编程中提高程序性能的重要技术手段,它允许程序同时执行多个任务。在C++中,多线程支持通过标准库<code><thread></code>及相关组件实现。本章将详细介绍C++多线程的基本概念、核心组件及实际应用。 == 什么是多线程? == 多线程是指在一个进程中创建多个'''执行流'''(线程),这些线程共享进程的资源(如内存空间),但拥有独立的调用栈和程序计数器。与单线程程序相比,多线程程序可以: * '''并行处理任务''':利用多核CPU提高计算效率。 * '''提高响应性''':例如在GUI程序中,主线程处理用户交互,后台线程执行耗时操作。 === 线程 vs 进程 === {| class="wikitable" |- ! 特性 !! 线程 !! 进程 |- | 资源占用 || 共享进程内存 || 独立内存空间 |- | 创建开销 || 较小 || 较大 |- | 通信方式 || 共享变量/同步原语 || IPC(管道、套接字等) |} == C++多线程核心组件 == C++11起引入的标准库支持多线程编程,主要包含以下头文件: * <code><thread></code>:线程管理 * <code><mutex></code>:互斥锁 * <code><condition_variable></code>:条件变量 * <code><future></code>:异步操作 === 基本线程示例 === 以下代码展示如何创建并运行线程: <syntaxhighlight lang="cpp"> #include <iostream> #include <thread> void hello() { std::cout << "Hello from thread!\n"; } int main() { std::thread t(hello); // 创建线程 t.join(); // 等待线程结束 return 0; } </syntaxhighlight> '''输出:''' <pre> Hello from thread! </pre> == 线程同步 == 多线程共享资源时需解决'''竞态条件'''问题。C++提供多种同步机制: === 互斥锁(Mutex) === <syntaxhighlight lang="cpp"> #include <mutex> #include <thread> std::mutex mtx; int counter = 0; void increment() { mtx.lock(); ++counter; mtx.unlock(); } </syntaxhighlight> === 使用RAII的<code>lock_guard</code> === 更安全的锁管理方式: <syntaxhighlight lang="cpp"> void safe_increment() { std::lock_guard<std::mutex> lock(mtx); ++counter; // 自动释放锁 } </syntaxhighlight> == 实际应用案例 == === 并行计算示例 === 计算斐波那契数列的并行版本: <syntaxhighlight lang="cpp"> #include <vector> #include <future> int fib(int n) { if (n < 2) return n; return fib(n-1) + fib(n-2); } int main() { std::vector<std::future<int>> futures; for (int i = 0; i < 10; ++i) { futures.push_back(std::async(std::launch::async, fib, i)); } for (auto &f : futures) { std::cout << f.get() << " "; } } </syntaxhighlight> == 线程通信 == 通过条件变量实现生产者-消费者模型: <mermaid> graph LR Producer-->|push data|Buffer Buffer-->|notify|Consumer Consumer-->|wait|Buffer </mermaid> <syntaxhighlight lang="cpp"> std::condition_variable cv; std::mutex mtx; std::queue<int> data_queue; void producer() { while (true) { std::lock_guard<std::mutex> lock(mtx); data_queue.push(42); cv.notify_one(); } } void consumer() { while (true) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, []{ return !data_queue.empty(); }); int data = data_queue.front(); data_queue.pop(); } } </syntaxhighlight> == 性能考量 == 多线程编程需注意: * '''线程开销''':线程创建/销毁成本 * '''虚假共享''':多个线程频繁修改同一缓存行的不同变量 * '''锁粒度''':过粗降低并行性,过细增加锁开销 数学上,Amdahl定律描述了并行加速上限: <math> S = \frac{1}{(1 - p) + \frac{p}{n}} </math> 其中<math>p</math>为并行部分比例,<math>n</math>为处理器数量。 == 总结 == C++多线程编程提供了强大的并发工具,但需要谨慎处理同步问题。关键点包括: * 使用<code>std::thread</code>管理线程生命周期 * 通过互斥锁保护共享数据 * 条件变量实现线程间通信 * 异步操作简化并行任务 掌握这些概念后,开发者可以构建高效、响应迅速的多线程应用程序。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 多线程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)