Если вектор инициализируется при запуске, он похож на массив фиксированного размера, поэтому нет необходимости его блокировать.
Я бы предпочел массив в этой точке :), выделенный с новым [], если хотите.
Если, скажем, потокN получает доступ только к полюN, никакой блокировки не требуется, блокировка необходима, когда несколько потоков пытаются получить доступ для чтения и записи одного и того же ресурса.
Если один поток обращается только к одному ресурсу для чтения и записи, и этот ресурс не доступен ни одному другому потоку, проблем абсолютно не возникает! Вам не нужен замок.
Если доступ к одному ресурсу между несколькими потоками возможен только в режиме только для чтения, блокировка не требуется.
И если было неясно, в вашем случае array[i]
- это ресурс для чтения / записи, а array
- это общий ресурс только для чтения.
Если вам нужно синхронизировать каждый элемент, вам нужен мьютекс для каждого элемента.
Если есть m ресурсов, к которым обращается m потоков, вам нужно заблокировать ресурсы, используя n мьютексов. Они не дорогие.
Если у вас действительно слишком много ресурсов, вы можете заблокировать части массива: один мьютекс сделает ваше приложение однопоточным, но вы можете, например, назначить 1 мьютекс на каждые 10 элементов. Таким образом вы уменьшаете количество мьютексов, но в то же время гарантируете, что не слишком много потоков не останавливаются вместе.