У меня есть два одинаковых кода.
Первая
#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.