如何在C++中实现两个for循环的并行同步执行?
让两个C++ for循环通过OpenMP并行执行
我懂你想要的效果——让两个规模相同的for循环真正同时启动、同步完成,总耗时和单个循环差不多,而不是先跑完一个再处理另一个。你的原代码问题很明确:第一个循环是完全串行执行的,只有第二个循环用了OpenMP并行,所以必然是先输出完所有ONE再输出TWO,完全没达到并行的目的。
这里给你一个简洁的实现,用OpenMP的sections构造就能搞定:
#include <iostream> #include <omp.h> // 必须包含OpenMP头文件,确保指令正常工作 using namespace std; #define N 5 int main(void) { // 并行区域:内部的每个section会被分配给不同线程并行执行 #pragma omp parallel sections { #pragma omp section { for (int i = 0; i < N; i++) { cout << "This is line ONE \n"; } } #pragma omp section { for (int i = 0; i < N; i++) { cout << "This is line TWO \n"; } } } return 0; }
编译命令和你原来的一样:
$ g++ parallel.cpp -fopenmp && ./a.out
为什么这个方案能满足需求?
#pragma omp parallel sections会创建一个并行区域,里面的每个section块会被分配给独立的线程执行(只要你的CPU有至少2个核心,OpenMP默认会启用足够的线程数)。- 两个for循环会同时开始执行,总耗时基本和单个循环的耗时一致(线程创建的开销可以忽略不计)。
关于输出的补充说明
你提到期望严格交替的输出,但实际运行时,因为两个线程同时向标准输出写内容,cout的输出可能会出现错乱(比如两行内容连在一起)——这是因为cout不是线程安全的无锁操作。如果想要更接近你期望的交替效果,可以给每个打印操作加个临界区,确保同一时间只有一个线程写输出:
// 修改循环内的打印部分 #pragma omp critical { cout << "This is line ONE \n"; }
这样输出会更规整,虽然会带来一点点同步开销,但完全不影响“两个循环并行执行”的核心需求。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

