Я пытаюсь разработать следующий блокировки свободного кода (C++ 11):блокировки свободного программирования - C++ атомное
int val_max;
std::array<std::atomic<int>, 255> vector;
if (vector[i] > val_max) {
val_max =vector[i];
}
Проблема в том, что при наличии большого числа нитей (128 потоков), результат неверно, потому что, если, например, val_max = 1 и три потока (с вектором [i] = 5, 15 и 20) будут выполнять код в следующей строке, и это будет гонка данных.
So , Я не знаю, как лучше всего решить проблему с доступными функциями в C++ 11 (я не могу использовать мьютекс, блокировки), защищая весь код.
Любые предложения? Заранее спасибо!
Опишите, чего вы хотите достичь. – chill
Возможно, это решит вашу проблему http://stackoverflow.com/questions/16190078/how-to-atomically-update-a-maximum-value – chill
Большая проблема в том, что даже если вы избавитесь от гонки данных, Конфликт на 'val_max' станет узким местом и убьет все преимущества производительности, которые вы ожидали от многопоточного решения. Ваш алгоритм кажется ошибочным, но поскольку вы не писали то, что пытались достичь, вам сложно помочь в его исправлении. – ComicSansMS