【发布时间】:2011-05-14 17:59:12
【问题描述】:
我有两个类似的代码。
第一
#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 来解决此问题。
【问题讨论】:
-
能否详细说明第二个程序崩溃的原因?指针 g 是否已损坏?而且,它什么时候坠毁?你可以打印 i 的值。我需要更多信息来理解这个问题。您可以为每次迭代和每个线程打印出一些变量。