多线程编程通过并行执行任务提升效率,使用 c++++ 标准线程库实现多线程步骤如下:使用 std::thread 创建线程,传入可调用对象(lambda 函数或函数指针)作为构造函数参数。通过调用 join() 方法等待线程终止,阻塞主线程直至子线程完成执行。实战案例:并行计算素数,将计算范围分配给多个线程并等待其完成,合并结果后打印素数列表。
使用 C++ 标准线程库实现多线程编程
多线程编程通过并行执行多个任务来提高程序效率。本文将介绍如何使用 C++ 标准线程库轻松实现多线程编程,并通过实战案例进行说明。
创建线程
要创建线程,可以使用 std::thread 类,它接收一个可调用对象的引用作为其构造函数的参数。可调用对象通常是一个 lambda 函数或一个函数指针。例如:
// 定义一个函数指针
void thread_function() {
// ... 执行此线程应执行的任务
}
// 创建线程
std::thread t(thread_function);
等待线程终止
创建线程后,主线程可以通过调用 join() 方法等待其终止。join() 方法将阻塞主线程,直到称为子线程的创建线程完成其执行。例如:
// 等待子线程完成
t.join();
实战案例:并行计算素数
让我们通过一个实战案例来演示多线程编程。我们将编写一个程序,使用多个线程并行计算给定范围内的素数。
#include <iostream>
#include <vector>
#include <thread>
bool is_prime(int n) {
if (n < 2) {
return false;
}
for (int i = 2; i <= n / 2; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
}
std::vector<int> find_primes(int start, int end) {
std::vector<int> primes;
for (int i = start; i <= end; ++i) {
if (is_prime(i)) {
primes.push_back(i);
}
}
return primes;
}
int main() {
int start = 1;
int end = 1000000;
int num_threads = 4;
// 分配计算范围
int range_size = (end - start) / num_threads;
std::vector<std::thread> threads;
std::vector<std::vector<int>> primes_list;
for (int i = 0; i < num_threads; ++i) {
int thread_start = start + i * range_size;
int thread_end = thread_start + range_size - 1;
threads.emplace_back(std::thread(find_primes, thread_start, thread_end));
}
// 等待线程完成并合并结果
for (auto& thread : threads) {
std::vector<int> primes;
thread.join();
thread.get(primes);
primes_list.push_back(primes);
}
std::vector<int> primes;
for (auto& list : primes_list) {
primes.insert(primes.end(), list.begin(), list.end());
}
// 打印素数列表
for (int prime : primes) {
std::cout << prime << " ";
}
std::cout << std::endl;
return 0;
}
运行该程序将输出给定范围内的所有素数。
注意:本教程演示了使用 C++ 标准线程库进行多线程编程的基本概念和实战应用。对于更高级的功能和最佳实践,建议参考 C++ 标准库文档和在线资源。