多线程编程通过并行执行任务提升效率,使用 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++ 标准库文档和在线资源。
以上是如何使用 C++ 标准线程库实现多线程编程?的详细内容。更多信息请关注PHP中文网其他相关文章!