Слишком много "// некоторого кода", чтобы быть уверенным, но для меня проблема в том, что вы не отпускаете те же блокировки, которые вы установили, т.е. значение subarr[k]
изменяется после вызова omp_set_lock
и до omp_unset_lock
. Одним из возможных решений было бы создание приватной переменной потока, например,
int n = subarr[k];
omp_set_lock(&lock[n]);
// do stuff
omp_unset_lock(&(lock[n]));
. Это гарантирует, что поток освобождает ту же блокировку, которую он установил.
В качестве бонуса: вы можете безопасно поставить #pragma omp parallel for
на вашей инициализации блокировки l oop для повышения производительности.