У меня есть массив int [100], и я хочу, чтобы 5 потоков вычисляли сумму всех элементов массива. Каждый поток выполняет итерацию по 20 элементам в пределах своего выделенного диапазона и записывает сумму в глобальную переменную суммы.
Прежде всего, стоит отметить, что накладные расходы на такое количество потоков, обрабатывающих такой небольшой объем данных, вероятно, не будут преимуществом. Создание потоков, сериализация доступа и ожидание их завершения требуют затрат. С таким небольшим набором данных хорошо оптимизированный последовательный алгоритм, вероятно, работает быстрее. Было бы интересно измерить ускорение при различном количестве потоков.
Нужен ли здесь мьютекс? Синхронизация не требуется, так как все потоки считываются из независимых источников.
Да, чтение переменной array
является независимым, однако обновление переменной sum
— нет, поэтому вам потребуется мьютекс для сериализации доступа к sum
в соответствии с вашим описанием выше.
Однако это очень неэффективный способ подсчета суммы, так как каждый поток будет конкурировать (и ждать, следовательно, тратить время) за доступ к приращению sum
. Если вы вычислите промежуточные суммы для каждого подмножества (как также упоминал @Werkov), затем дождитесь их завершения и добавите промежуточные суммы для создания окончательной суммы, чтения или записи не будет, поэтому вам не понадобится мьютекс и каждый поток мог работать как можно быстрее. В этом случае ограничивающим фактором производительности, скорее всего, будет шаблон доступа к памяти и поведение кэша.
Может ли это привести к непредсказуемому поведению или ОС действительно справляется с этим?
Да, безусловно. ОС не справится с этим за вас, так как не может предсказать, как/когда вы будете обращаться к разным частям памяти и по какой причине. Общие данные должны быть защищены между потоками всякий раз, когда любой из них может записывать данные. Таким образом, вы почти наверняка получите неправильный результат, поскольку потоки перекрывают друг друга, обновляя sum
.
Целесообразно ли исключить мьютекс в этом случае? Я заметил, что эти алгоритмы работают намного быстрее без него.
Нет, определенно нет. Он может работать быстрее, но почти наверняка не даст вам правильного результата!
10.05.2015