SyncLock при записи? Читать? Или оба? - PullRequest
5 голосов
/ 07 января 2011

Предположим, у меня есть байтовый массив, Private Data as Byte(). Этот массив является частным внутри класса. Класс предоставляет публичные функции для чтения и записи в Data.

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

Пока я использую SyncLock, чтобы избежать проблем. Могу ли я поместить SyncLock Data только в функции записи, или это должно быть в функциях чтения? Или оба?

У меня нет конкретного примера кода. Мне просто любопытно, есть ли какая-либо польза от блокировки функций чтения и записи, если SyncLock функций записи обеспечит первичному доступу к записи эксклюзивный доступ.

Ответы [ 2 ]

5 голосов
/ 07 января 2011

Вместо использования SyncLock вам следует рассмотреть возможность использования ReaderWriterLockSlim (или ReaderWriterLock , если вы не в .NET 4).

Он предназначен для одного автора, но нескольких читателей. Обычно это идеально подходит для ситуации, подобной той, которую вы описываете.

В противном случае вы можете использовать SyncLock, но вам необходимо заблокировать операции чтения и записи. Без блокировки на обоих устройствах ваш читатель может читать данные, пока писатель все еще пишет, что заставит вас читать половинные данные.

4 голосов
/ 07 января 2011

Основная причина, по которой вы хотите заблокировать чтение байтового массива, состоит в том, чтобы избежать «фантомного чтения» или другого неповторяемого чтения - если пишущий находится в процессе обновления массива, читатель может увидеть некоторые старые значения и некоторые новые значения или старое значение, а затем новое значение, если оно снова его читает.

Например, если у вас есть массив, содержащий [1, 2, 3, 4, 5, 6], и поток записи, который принимает SyncLock и перебирает массив, добавляя 1 к каждому элементу, читатель, который SyncLock не может видеть странности, подобные [2, 3, 4, 4, 5, 6] - только потоки, которые фактически принимают SyncLock, получат любую безопасность.

...