C++多线程编程入门指南
在当今多核处理器盛行的时代,掌握多线程编程技术已成为每个程序员的必修课。C++作为一门高效且功能强大的编程语言,提供了丰富的多线程编程支持。本文将带你走进C++多线程编程的世界,从基础概念到实战应用,助你轻松入门。

一、多线程编程基础
1.1 什么是多线程?
多线程编程是指在一个程序中同时运行多个线程,每个线程可以独立执行任务,从而提高程序的执行效率和响应速度。
1.2 为什么使用多线程?
- 提高性能:多线程可以充分利用多核处理器的优势,并行处理任务。
- 改善响应性:在GUI应用程序中,可以使用一个线程处理用户界面,另一个线程处理后台任务,避免界面卡顿。
- 简化设计:将复杂任务分解为多个简单任务,每个任务由一个线程处理,使程序结构更清晰。
二、C++多线程库
C++11标准引入了 <thread> 库,极大地简化了多线程编程。以下是一些常用的类和函数:
std::thread:创建和管理线程。std::mutex:互斥锁,用于保护共享资源。std::condition_variable:条件变量,用于线程间的同步。std::atomic:原子操作,用于无锁编程。
三、创建和运行线程
3.1 创建线程
使用 std::thread 类可以轻松创建线程。以下是一个简单的示例:
#include <iostream>
#include <thread>
void printHello() {
std::cout << "Hello from thread!" << std::endl;
}
int main() {
std::thread t(printHello);
t.join(); // 等待线程结束
return 0;
}
3.2 线程的分离
使用 detach() 方法可以让线程在后台运行,主线程不会等待其结束:
#include <iostream>
#include <thread>
void printHello() {
std::cout << "Hello from thread!" << std::endl;
}
int main() {
std::thread t(printHello);
t.detach(); // 线程分离
std::cout << "Main thread continues..." << std::endl;
return 0;
}
四、线程同步
4.1 互斥锁
当多个线程访问共享资源时,需要使用互斥锁来避免数据竞争:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void printMessage(int id) {
mtx.lock();
std::cout << "Thread " << id << " is running" << std::endl;
mtx.unlock();
}
int main() {
std::thread t1(printMessage, 1);
std::thread t2(printMessage, 2);
t1.join();
t2.join();
return 0;
}
4.2 条件变量
条件变量用于线程间的同步,以下是一个生产者-消费者模型的示例:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void producer() {
std::unique_lock<std::mutex> lck(mtx);
ready = true;
std::cout << "Producer is ready" << std::endl;
cv.notify_one();
}
void consumer() {
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return ready; });
std::cout << "Consumer is running" << std::endl;
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
五、实战应用
5.1 并行计算
多线程可以用于并行计算,提高程序的执行效率。以下是一个简单的并行求和示例:
#include <iostream>
#include <thread>
#include <vector>
void partialSum(const std::vector<int>& data, int start, int end, long long& result) {
long long sum = 0;
for (int i = start; i < end; ++i) {
sum += data[i];
}
result = sum;
}
int main() {
std::vector<int> data(1000000, 1);
long long result1 = 0, result2 = 0;
std::thread t1(partialSum, std::ref(data), 0, 500000, std::ref(result1));
std::thread t2(partialSum, std::ref(data), 500000, 100000