linux C 中带有 pthreads 的 Openmp parallel for 循环语法

Openmp parallel for loop syntax in linux C with pthreads

我用 openmp 完成了下面的代码,但是函数

nvme_identify(fd, 0, 1, data);      

依次调用 ioctl(),它是 nvme 的阻塞系统调用。因此,为了获得真正的并行性,我希望使用与 pthreads 相同的代码。

我是 pthreads 的新手,所以任何人都可以为我提供以下 openmp 代码的 pthreads 语法吗?

#pragma omp parallel for num_threads(5)
for(i=0; i<rc; i++){
      err = nvme_identify(fd, 0, 1, data);
}

Pthreads 与 OpenMP 有点像手动操作。 作为伪代码,您可以尝试这样的事情:

main()

为要在 nvme_identify(fd, 0, 1, data)
中使用的参数创建结构 假设 my_struct[NUM_OF_THREADS]
NUM_OF_THREADS 是(如您猜测的那样)您将生成的线程数。

正确填写参数,即:
my_struct[0].fd = fd
my_struct[0].data = data
...

使用 for 循环创建 pthreads,例如:

for (i=0; i < NUM_OF_THREADS; i++) pthreads_create(...., MyThreadedFunction, (void*)&my_struct[i]);

MyThreadedFunction(void *val) 像这样恢复参数:
struct my_struct_tag *my_struct = (struct my_struct_tag *)val;
int fd = my_struct->fd
...
并致电 err = nvme_identify(fd, 0, 1, data)

正确调整参数以获得最大并行度。
在 main 中,您需要使用 pthread_join 来等待所有线程完成。

我的逻辑可能有错误。这是一个快速的答案。 希望对您有所帮助。