Безопасно ли получать доступ к различным подмассивам с разными потоками без синхронизации? - PullRequest
2 голосов
/ 23 февраля 2012

Если у меня есть 10 потоков и массив из 10 подмассивов, безопасно ли, чтобы каждый поток работал на отдельном подмассиве? то есть, thread [0] выполняет вещи в массиве [0], thread [1] делает вещи в массиве [1] и т. д. Или это небезопасно? Имеет ли значение, если это вектор или массив (или какой-либо набор данных по этому вопросу)?

Ответы [ 4 ]

3 голосов
/ 23 февраля 2012

Да, вы в безопасности. Пока ни один из потоков не изменяет ресурс, к которому другие потоки обращаются без охраны или синхронизации, вы в безопасности. Неважно, если адреса памяти очень близки друг к другу; близость не играет роли. Все, что имеет значение, это то, есть ли совместное использование, и если да, то любой из потоков изменяет общий ресурс.

1 голос
/ 28 февраля 2012

По сути, да - это безопасно на уровне массива (но это также может зависеть - см. Ниже). Однако, если бы это была другая структура, например, дерево или двусвязный список, то вы можете столкнуться с проблемами, если попытаетесь изменить структуру, поскольку изменение одного элемента может потребовать изменения и других элементов, что небезопасно. , Но пока вы только читаете данные, у вас должно быть все в порядке. Одна возможная ловушка, если массив содержит ссылки или указатели. В этом случае может случиться так, что, когда вы обращаетесь к отдельным записям массива, они прямо или косвенно ссылаются на одни и те же области в памяти. В этом случае вы должны выполнить правильную синхронизацию.

Итак, одним словом: если это массив типа int или другой простой тип данных, вы в полной безопасности. Если это не массив или элементы не полностью на месте, но содержат указатели или ссылки, вы должны быть осторожны.

1 голос
/ 23 февраля 2012

Да, но остерегайтесь ложного обмена .

0 голосов
/ 23 февраля 2012

Если вы создадите «материнский массив», который содержит 10 меньших массивов, и каждый поток получает доступ исключительно к одному из этих массивов, то ничего плохого не произойдет.Размер элементов этих массивов не имеет значения.

Если вы используете более сложные структуры вместо массивов, если чтение ничего не меняет, вы тоже в безопасности.Однако, если простое чтение из структуры может изменить его (например, что-то кэшировано, реорганизовано), параллельные потоки, обращающиеся к материнской структуре, могут быть проблематичными.

Кроме этого - я не вижу никакого случаякогда это может вызвать проблемы.

...