2012-12-28 2 views
3

나는 MemoryBlock 클래스를 디자인했습니다. 이름처럼 그것은 (관리되지 않는) 메모리 블록입니다. 난 그냥 var x = new MemoryBlock (1024, 16) 할 그리고 그것은 나에게 1kB의 메모리를 제공합니다 (또한 16 바이트로 정렬). 이제 일부 스레드는 안전하지 않은 컨텍스트를 사용하여이 블록을 읽고 쓰고 싶어합니다. 스레드를 동기화하려면 SyncRoot 속성을 사용했습니다. 그래서 나는 lock (myMemoryBlock.SyncRoot)을하고 메모리와 함께 몇 가지 일을한다. 나는 그것이 좋은 것인지 아닌지를 모르지만, 나는 colletions에서 이것을 보았다.
이 간단한 메커니즘은 둘 이상의 스레드가이 개체에 액세스하는 것을 허용하지 않습니다. 글쓰기에는 괜찮지 만 독서에는 충분하지 않습니다.공유 객체 및 스레드

1) 스레드가 이의를 쓰는 경우, 다른 스레드가 액세스 할 수 없습니다이 객체
2) 스레드가 개체에서 읽는 경우, 다른 많은 스레드가이 개체에서 읽을 수 있지만 쓸 수 없습니다 :이 같은 뭔가를 원하는 it
3) 객체가 쓰여지고 쓰레드가 쓰기를 원한다면 쓰레드는 객체가 비어있을 때까지 기다린다.
4) expert 모드 : 어떤 쓰레드가 객체를 읽고 다른 쓰레드가 쓰기를 원할 때까지 기다린다. free뿐만 아니라 중지 할 객체에이 객체 (큐)에서 읽으려는 새 스레드에 대한 액세스를 제공합니다.

나는 코드가 필요없는 간단한 팁을 매우 기쁘게 생각합니다.

+1

당신은이 질문에 대해 살펴 http://stackoverflow.com/questions/2116957/readerwriterlock-vs-lock을 할 수 있습니다 : 여기

이 클래스의 일반적인 사용법이다 – juharr

답변

1

ReaderWriterLockSlim을 찾으십시오. 기본적으로 많은 독자가 동시에 읽을 필요가있는 모든 경우에 도움이되지만 모든 작성자가 모든 독자를 차단해야합니다. 읽기/쓰기 비율이 50:50 인 경우 일반 잠금 (obj) {}을 사용하십시오.

예 : ReadWriteLockSlim은 캐싱에 적합합니다 (즉, 초당 많은 판독기가 있지만 5 분마다 한 번 캐시 업데이트).

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

1

당신은 ReaderWriterLockSlim를 사용해야합니다.

public class SomeClass 
{ 
    private MemoryBlock block = new MemoryBlock(1024, 16); 

    private ReaderWriterLockSlim blockSyncObjcect = new ReaderWriterLockSlim(); 

    public void SomeRead() 
    { 
     blockSyncObjcect.EnterReadLock(); 

     // Safe reading from the block 

     blockSyncObjcect.ExitReadLock(); 
    } 

    public void SomeWrite() 
    { 
     blockSyncObjcect.EnterWriteLock(); 

     // Safe writing to the block 

     blockSyncObjcect.ExitWriteLock(); 
    } 
}