Как отмечали другие в комментариях, у вас есть условие гонки между проверкой состояния вашего цикла и использованием значения idx
.Это может заставить вас читать за концом массива.Для вашей функции потока требуется небольшая настройка:
void threadFunction(Object** objects, int n) {
Object* current = NULL;
while (true) {
int next = idx++;
if (next < nobjects - 1) {
current = objects[next];
// do calculation
} else {
break;
}
}
}
В общем, доказать, что алгоритм без блокировок верен, сложно, и это можно сделать только путем тщательной проверки кода.Размер массива никоим образом не влияет на корректность этого алгоритма.
Использование стандартной библиотеки
Хотя об этом специально не спрашивали, вероятно, стоит указатьчто все это можно сделать через стандартную библиотеку (которая позволяет избежать сложных вопросов безопасности и обрабатывает такие вопросы, как разбиение).Примерно так:
void DoCalculations(Object& obj)
{
// details...
}
// later...
std::vector<std::unique_ptr<Object>> objects = CreateObjects();
std::for_each(
std::execution::par,
objects.begin(),
objects.end(),
[] (std::unique_ptr<Object> const& p) { DoCalculations(*p); });