线程中的 OpenMP 阻塞调用

OpenMP blocking call in thread

我已经在使用 OpenMP 进行一些并行处理,并且想添加一个带有阻塞接收的控制线程。大多数时候这个线程会被阻塞,因此我不希望它坐在那里占用一个核心。理想情况下,阻塞调用会触发对额外工作线程的 yield。 OpenMP 将如何处理阻塞调用?

像这样:

#include <omp.h>

int main()
{
int cores = omp_get_num_procs();
#pragma omp parallel num_threads(cores + 1) 
    if (omp_get_thread_num() == 0) {
        send();
        blockingReceive();
    }
    else
    {
        work();
    }
}

这实际上不是关于 OpenMP 的问题,或者肯定不是关于标准的问题。一般来说,OpenMP 实现不太可能知道执行 blockingReceive() 的线程已阻塞,因为它无法轻易发现它可以在编译时阻塞,并且在 run-time 时也看不到它除非它拦截所有系统调用。

相反,这是一个关于当线程数多于逻辑 CPU(超额订阅)时操作系统如何调度线程的问题。如果我们假设您的 blockingReceive() 变成阻塞的 read() 系统调用,那么 OS 知道该线程空闲,并且应该将另一个线程调度到该逻辑 CPU 上,这正是您想要的.