Включает ли чтение какие-либо блокировки в многопоточных приложениях? - PullRequest
3 голосов
/ 23 ноября 2011

Предположим, у меня есть структура данных S в памяти.S сложен, скажем, дерево или граф.У меня есть два потока, проходящих через S, и они могут нажать и попытаться прочитать один и тот же адрес одновременно.Мой вопрос: существует ли какой-либо вид неявной блокировки в этой точке, так что возникает конфликт между потоками?Если это имеет значение, я использую C, pthreads на обычной машине SMP.

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

Нет. Нет необходимости в блокировке с помощью операций только для чтения.

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

0 голосов
/ 23 ноября 2011

Во-первых, в Си не делается неявная блокировка. Язык C очень похож на язык "вот верёвка", в котором вы всегда можете повеситься.

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

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

0 голосов
/ 23 ноября 2011

Если нет изменений, чтение всегда потокобезопасно.

...