次のコードは、OpenMP タスクの 1 つが が指す要素の 1 つを削除するため、クラッシュしit
ます。この問題を解決するにはどうすればよいですか? コードは、OpenMP タスクを使用して実装する必要があります。
#pragma omp parallel
{
#pragma omp single nowait
{
for (std::list<Class*>::iterator it = myClass.begin(); it != myClass.end();) {
if ((*it)->getNumber() == 0) {
#pragma omp critical
it = myClass.erase(it);
}
else {
#pragma omp task firstprivate(it)
{
bool result = (*it)->function(t);
if ( result ) {
#pragma omp critical
it = myClass.erase(it);
}
}
}
++it;
}
}
#pragma omp taskwait
}