Глядя на ваш код, кажется, что все переменные являются общими / видимыми между потоками.
Из-за этого, к сожалению, невозможно предсказать, что происходит при выполнении вашего кода, из-за условия параллельной гонки.
Состояние гонки - это когда выполняющиеся потоки находятся в разных частях кода, изменяя значения переменных, когда вы этого не хотите. Причинение непредсказуемого результата.
например:
int main(){
int var=0; //shared variable, visible to all threads
#pragma omp parallel
{
int myOnly; //private variable, each thread have it's own
if ( var <= 0)
var++;
else
var--;
myOnly = var;
printf("private variable: %d\n",myOnly);
}
printf("value : %d", var);
}
Предположим, что у нас здесь есть 2 работающих потока, если первый поток выполняет проверку if()
и достигает var++
до того, как второй поток выполняет проверку if()
, второй поток введет код else
( вместо if
).
Но если второй поток проверяет оператор if()
перед тем, как первый изменит значение var
, он выполнит var++;
, а не var--;
.
Таким образом, значение myOnly может быть равно -1 или 1 для обоих только в одном потоке, в зависимости от того, что произошло.
И как мы узнаем, какой из них случится? Мы не
Каждый поток работает независимо, нет способа предсказать, что произойдет.
Для этого есть #pragma omp barrier
и другие инструменты параллельной синхронизации, но они очень дорогостоящие.
Попытайтесь упорядочить переменные и создать локальные (частные) потоки, чтобы у одного потока не было возможности перезаписать что-либо, чего не должно быть.