C++ 使用OpenMP处理单链表

C++ 使用OpenMP处理单链表,c++,linked-list,openmp,C++,Linked List,Openmp,我要并行化的代码具有以下简单形式: for(const ListItem* item = myList; item; item = item->getNext()) doSthWith(item); 我在MSVC 2013上编译,支持omp 2.0。是否仍有可能以一种干净高效的方式将其并行化?我遇到的第一个问题是我需要一个积分环计数器。很明显,我可以使用int并在循环中分配指针,但这已经开始感觉像是一种肮脏的解决方法。 像这样的迭代类型是omp标准支持的,还是最终会出现在UB中?也许

我要并行化的代码具有以下简单形式:

for(const ListItem* item = myList; item; item = item->getNext())
  doSthWith(item);
我在MSVC 2013上编译,支持omp 2.0。是否仍有可能以一种干净高效的方式将其并行化?我遇到的第一个问题是我需要一个积分环计数器。很明显,我可以使用int并在循环中分配指针,但这已经开始感觉像是一种肮脏的解决方法。
像这样的迭代类型是omp标准支持的,还是最终会出现在UB中?

也许不是一个真正的答案,但我无法在注释中格式化代码

假设列表没有被修改,您可能会写一些类似这样的不愉快的东西(在这里输入,没有编译,没有测试)


如果升级到现代(OpenMP 3.1或4.0)编译器,则可以通过任务相当自然地实现它。(如果你是一名学生,你可以免费获得英特尔编译器…)是的,我知道,但不幸的是,我被绑定到MSVC。我的意思是,我也同意上面提到的变通方法,只要它们遵守定义良好的行为。
#pragma omp parallel
{
    int nThreads = omp_get_num_threads();
    int me       = omp_get_thread_num();
    int itemNo   = 0;

    for(const ListItem* item = myList; 
        item; 
        (item = item->getNext()), itemNo++)
    {
        if (itemNo%nThreads == me)
        {
            doSthWith(item);
        }
    }
}