引言
随着计算机技术的发展,多线程编程已经成为现代软件开发中不可或缺的一部分。C++11标准引入了丰富的并发编程特性,使得开发者能够更加方便地利用多核处理器的能力,提高程序的执行效率。本文将为您介绍C++11并发编程的基础知识,并通过实际案例帮助您掌握多线程高效编程技巧。
一、C++11并发编程基础
1.1 线程
在C++11中,线程可以通过<thread>头文件中的thread类来创建。以下是一个创建线程的基本示例:
#include <thread>
void printHello() {
std::cout << "Hello from thread!" << std::endl;
}
int main() {
std::thread t(printHello);
t.join(); // 等待线程结束
return 0;
}
1.2 同步
在多线程编程中,同步是确保线程安全的关键。C++11提供了多种同步机制,包括互斥锁(mutex)、条件变量(condition_variable)和原子操作(atomic)。
1.2.1 互斥锁
互斥锁可以确保同一时刻只有一个线程可以访问共享资源。以下是一个使用互斥锁保护共享资源的示例:
#include <mutex>
std::mutex mtx; // 全局互斥锁
void printHello() {
mtx.lock(); // 加锁
std::cout << "Hello from thread!" << std::endl;
mtx.unlock(); // 解锁
}
1.2.2 条件变量
条件变量允许线程在某些条件下暂停执行,直到另一个线程满足条件并通知它。以下是一个使用条件变量的示例:
#include <condition_variable>
#include <thread>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void doWork() {
std::unique_lock<std::mutex> lock(mtx);
// 模拟耗时操作
std::this_thread::sleep_for(std::chrono::seconds(1));
ready = true;
cv.notify_one(); // 通知一个等待的线程
}
void checkCondition() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{return ready;}); // 等待条件满足
std::cout << "Condition satisfied!" << std::endl;
}
int main() {
std::thread worker(doWork);
std::thread checker(checkCondition);
worker.join();
checker.join();
return 0;
}
1.2.3 原子操作
原子操作可以确保操作在执行过程中不会被中断,从而保证线程安全。以下是一个使用原子操作的示例:
#include <atomic>
std::atomic<int> count(0);
void increment() {
count.fetch_add(1, std::memory_order_relaxed); // 原子增加
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Count: " << count.load(std::memory_order_relaxed) << std::endl;
return 0;
}
二、实战案例
以下是一个使用C++11并发编程特性的实际案例:计算斐波那契数列的前N个数的和。
#include <thread>
#include <vector>
#include <atomic>
std::atomic<int> sum(0);
void calculateFibonacci(int n) {
int a = 0, b = 1, c;
for (int i = 0; i < n; ++i) {
c = a + b;
a = b;
b = c;
sum.fetch_add(c, std::memory_order_relaxed);
}
}
int main() {
int n = 100; // 计算斐波那契数列的前100个数的和
std::thread t1(calculateFibonacci, n / 2);
std::thread t2(calculateFibonacci, n / 2);
t1.join();
t2.join();
std::cout << "Sum: " << sum.load(std::memory_order_relaxed) << std::endl;
return 0;
}
三、总结
C++11并发编程提供了丰富的特性,可以帮助开发者轻松实现多线程程序。本文介绍了C++11并发编程的基础知识,并通过实际案例展示了如何使用这些特性。希望本文能帮助您入门C++11并发编程,并在实际项目中发挥其优势。
