2011-01-07 5 views
4

바이트 배열 Private Data as Byte()이 있다고 가정합니다. 이 배열은 클래스 내에서 private입니다. 이 클래스는 읽기 및 쓰기를위한 공용 함수를 Data에 제공합니다.WriteLock on Write? 독서? 아니면 둘다?

이 클래스는 여러 스레드에서 액세스 할 수 있으므로이 클래스를 읽고 쓰는 것이 동시에 발생하지 않는 상황을 피하고자합니다.

현재로서는 문제를 피하기 위해 SyncLock을 사용하고 있습니다. 쓰기 기능에 SyncLock Data을 넣을 수 있습니까? 아니면 읽기 기능에 있어야합니까? 아니면 둘다?

특정 코드 예제를 염두에두고 있지 않습니다. 필자는 쓰기 기능 'SyncLock이 쓰기 작업을 처음부터 독점적으로 수행하도록 만드는 경우 읽기 및 쓰기 기능을 모두 잠그는 것이 어떤 이점이 있는지 궁금합니다.

답변

3

바이트 배열 읽기를 잠글 때 가장 큰 이유는 "팬텀 읽기"또는 반복 불가능한 다른 읽기를 방지하기 위해서입니다. 작성자가 배열을 업데이트하는 중일 때 독자는 이전 값을 볼 수 있습니다 일부 새 값 또는 이전 값을 읽은 다음 새 값을 읽으면 다시 읽습니다.

예를 들어, [1, 2, 3, 4, 5, 6]을 포함하는 배열과 SyncLock을 사용하고 배열을 반복하여 각 요소에 1을 더하는 작성자 스레드 인 경우 SyncLock은 [2, 3, 4, 4, 5, 6]과 같은 이상한 것을 볼 수 있습니다. 실제로는 SyncLock을 사용하는 스레드 만 안전합니다.

+0

네, 그게 제가 피하고 싶습니다. 그러나 바이트 배열에 쓸 때'SyncLock'을 사용하면이 문제가 발생하지 않아야합니까? – Brad

+1

잠금에 참여하는 스레드 만 보호됩니다. 잠기지 않은 스레드는 반 갱신 상태를 볼 수 있습니다. –

+0

예. 읽기 작업이 아닌 쓰기 작업 만 잠그면 유효하지 않은 데이터를 읽을 수 있습니다. 그것이이 게시물의 내용입니다. –

4

SyncLock을 사용하는 대신 ReaderWriterLockSlim (또는 .NET 4가 아닌 경우 ReaderWriterLock)을 사용해야합니다.

단일 작성자가 허용되지만 여러 독자가 허용됩니다. 이는 일반적으로 설명하는 것과 같은 상황에 이상적입니다.

그렇지 않으면 SyncLock을 사용할 수 있지만 읽기 및 쓰기 작업을 잠 가야합니다. 두 가지 모두에 잠금 장치가 없으면 라이터가 아직 쓰는 동안 독자가 ​​데이터를 읽을 수 있습니다. 그러면 절반 세트의 데이터를 읽을 수 있습니다.

+0

나는 ReaderWriterLockSlim을 살펴볼 것이다. – Brad