C++多线程编程实战:从入门到精通的50个经典案例解析

在计算机科学领域,多线程编程是一项至关重要的技能。它能够显著提高程序的性能,特别是在处理多任务和资源密集型应用时。C++作为一种强大的编程语言,提供了丰富的工具和库来支持多线程编程。本文将深入探讨C++多线程编程,通过50个经典案例解析,帮助读者从入门到精通。
1. 基础概念
1.1 线程与进程
线程是操作系统能够进行运算调度的最小单位,它是进程中的实际运作单位。进程是程序在执行过程中分配和管理资源的基本单位。
1.2 线程同步
线程同步是指多个线程在执行过程中,通过某种方式保证它们不会相互干扰,从而保证数据的一致性和程序的正确性。
1.3 线程通信
线程通信是指线程之间进行信息交换和协作的过程。
2. C++多线程编程基础
2.1 库
C++11标准引入了 库,提供了创建和管理线程的接口。
#include

void task() {
// 线程执行的代码
}

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

库

库提供了互斥锁、条件变量等同步原语。
#include

std::mutex mtx;

void printHello() {
mtx.lock();
// 临界区代码
mtx.unlock();
}
2.3

库

库提供了原子操作,用于保证操作的原子性和可见性。
#include

std::atomic counter(0);

void increment() {
counter.fetch_add(1, std::memory_order_relaxed);
}
3. 经典案例解析
3.1 案例一:计算斐波那契数列
使用多线程计算斐波那契数列,提高计算效率。
#include #include

int fibonacci(int n) {
if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } void computeFibonacci(int n, int& result) { result = fibonacci(n); } int main() { int n = 30; int result; std::thread t(computeFibonacci, n, std::ref(result)); t.join(); std::cout << "Fibonacci(" << n << ") = " << result << std::endl; return 0; } 3.2 案例二:生产者-消费者问题 使用互斥锁和条件变量实现生产者-消费者问题。 #include #include
#include
#include

std::queue queue;
std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void producer() {
for (int i = 0; i < 10; ++i) { std::unique_lock lock(mtx);
queue.push(i);
ready = true;
lock.unlock();
cv.notify_one();
}
}

void consumer() {
int value;
while (true) {
std::unique_lock lock(mtx);
cv.wait(lock, [] { return ready; });
value = queue.front();
queue.pop();
ready = false;
lock.unlock();
std::cout << "Consumed: " << value << std::endl; } } int main() { std::thread prod(producer); std::thread cons(consumer); prod.join(); cons.join(); return 0; } 3.3 案例三:线程池 使用线程池管理线程,提高程序性能。 #include #include
#include
#include
#include
#include

std::queue> tasks;
std::mutex mtx;
std::condition_variable cv;
bool done = false;

void worker() {
while (true) {
std::function task;
{
std::unique_lock lock(mtx);
cv.wait(lock, [] { return !tasks.empty() || done; });
if (done && tasks.empty()) break;
task = std::move(tasks.front());
tasks.pop();
}
task();
}
}

void addTask(std::function task) {
std::unique_lock lock(mtx);
tasks.push(task);
lock.unlock();
cv.notify_one();
}

int main() {
std::vector threads;
for (int i = 0; i < 4; ++i) { threads.emplace_back(worker); } for (int i = 0; i < 10; ++i) { addTask([i] { std::cout << "Processed " << i << std::endl; }); } done = true; cv.notify_all(); for (auto& t : threads) { t.join(); } return 0; } 4. 总结 本文通过50个经典案例解析,详细介绍了C++多线程编程的基础知识和实战技巧。读者可以根据自己的需求,选择合适的案例进行学习和实践。随着经验的积累,相信大家能够熟练掌握C++多线程编程,为今后的软件开发打下坚实的基础。