OpenMP如何实现2个线程轮流执行函数n次的惯用方法?
OpenMP实现双线程轮流打印的惯用方案
OpenMP中实现两个线程按顺序轮流执行的逻辑不需要像pthread那样编写繁琐的条件变量代码,通常采用自旋变量配合内存刷新指令的方案即可,代码非常简洁:
#include <stdio.h> #include <omp.h> int main() { // 每个线程需要打印的次数,可按需修改 const int print_count = 10; // 标记当前允许执行的线程ID,初始放行0号线程 int turn = 0; // 固定启动2个工作线程 #pragma omp parallel num_threads(2) { int tid = omp_get_thread_num(); for (int i = 0; i < print_count; ++i) { // 自旋等待轮到当前线程执行 while (turn != tid) { // 强制刷新内存获取turn的最新值,避免编译器优化导致死等 #pragma omp flush(turn) // 可选:CPU占用过高时可加此行主动让出调度权 // #pragma omp taskyield } // 调用你的打印线程ID的函数 printf("id: %d\n", tid); // 切换执行权限给另一个线程 turn = 1 - tid; // 刷新内存将turn的更新同步到所有线程可见 #pragma omp flush(turn) } } return 0; }
实现说明
- 核心逻辑依靠全局的
turn变量作为执行权限标记,两个线程只有拿到对应权限时才会执行打印逻辑 omp flush是必须的指令,用于关闭CPU/编译器对变量的缓存优化,保证所有线程看到的turn值是最新的- 如果
print_count数值很大,可在自旋循环中加入omp taskyield指令让空等的线程主动让出CPU资源,降低空载占用 - 整个实现不需要手动初始化、销毁同步对象,代码量比pthread条件变量版本精简60%以上
内容的提问来源于stack exchange,提问作者avernus
相关产品推荐
相关产品推荐

