【发布时间】:2018-02-09 00:13:13
【问题描述】:
喂
我正在尝试对下面的函数进行多线程处理。我无法让计数器在 OpenMP 线程之间正确共享,我尝试了 atomic 和 int,atomic 似乎不起作用,INT 也没有。不确定,我迷路了,我该如何解决?
std::vector<myStruct> _myData(100);
int counter;
counter =0
int index;
#pragma omp parallel for private(index)
for (index = 0; index < 500; ++index) {
if (data[index].type == "xx") {
myStruct s;
s.innerData = data[index].rawData
processDataA(s); // processDataA(myStruct &data)
processDataB(s);
_myData[counter++] = s; // each thread should have unique int not going over 100 of initially allocated items in _myData
}
}
编辑。更新错误的语法/缺失的部分
【问题讨论】:
-
您选择将索引设为私有是否有特殊原因?
-
不编译。
inxed应该是index吗?请发帖minimal reproducible example -
这似乎是解释为什么需要关键部分的典型示例。顺便说一句,不初始化就使用
counter是不好的。 -
您需要更清楚地描述预期的行为是什么以及似乎不起作用意味着什么。特别是,
_myData中的结果必须是确定性排序的吗?另外,myStruct是什么,processData{A,B}有多贵。了解这一点对于提供具有合理性能的建议至关重要。 -
@MikeCAT 如果数据竞争只涉及
counter,我更喜欢使用原子操作而不是关键部分。即int temp; #pragma omp atomic capture { temp = counter++; } _myData[temp] = s;.
标签: c++ multithreading concurrency openmp