У меня есть два одинаковых кода.
Первая
#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}
Второе
#pragma omp parallel for shared(g) private(i) schedule(static, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}
Единственная разница в первой строке. Первый код работает нормально, но второй сбой. Почему?
Проблема находится где-то в actualNumberOfChromosomes
, но я хотел бы понять, почему, а не просто решить это. Я мог бы решить это, создав добавочную переменную p
и присвоив ей actualNumberOfChromosomes
и изменив цикл так, чтобы i
был равен p
.