就我在多个源中找到的情况而言,当将数组作为private
传递到OpenMP控件块时,每个线程都应该使它成为此数组的副本。但是,我在一段代码中看到了不同的行为,具有以下结构:
int row, col;
int s[9][9];
omp_set_num_threads(9);
#pragma omp parallel for firstprivate(s)
for (int val = 1; val < 10; val++) {
s[row][col] = val;
bool b = solve(s, row + col / 9, (col + 1) % 9);
if (b) {
//do stuff
}
}
其中函数solve()
确实修改变量s
,但不触及任何全局变量。
但是,我发现,通过例程求解修改变量s
(对于包含在底部的完整性),也会影响所有其他线程中的变量s
。
这是二维数组的问题还是我忽略了一些基本的东西?
常规solve()
:
bool solve(int s[9][9], int row, int col) {
while(s[row][col] != 0) {
col = (col + 1) % 9;
row = row + col / 8;
if(row == 9)
return true;
}
for (int val = 1; val < 10; val++) {
if (isPossible(s,row,col,val)){
s[row][col] = val;
if (solve(s, row + col / 9, (col + 1) % 9))
return true;
s[row][col] = 0;
}
}
return false;
}