6

프로세스 전체에서 작동하는 읽기/쓰기 잠금 메커니즘이 있습니까 (Mutex와 비슷하지만 독점 잠금 대신 읽기/쓰기)? 동시 읽기 액세스를 허용하려고하지만 독점 쓰기 액세스를 허용하려고합니다..NET에서 크로스 프로세스 읽기 - 쓰기 동기화 원시.

+0

크로스 프로세스 또는 크로스 스레드? –

+0

@Albin - 교차 프로세스. – Jeremy

+0

해결책을 찾았습니까? – Bipul

답변

4

아니요. 리차드가 위에서 언급 한 것처럼 NET에서 상자 메커니즘. 뮤텍스와 세마포어를 사용하여 구현하는 방법입니다.

방법 # 1 인용, http://www.joecheng.com/blog/entries/Writinganinter-processRea.html에 설명되어 있습니다 :

// create or open global mutex 
GlobalMutex mutex = new GlobalMutex("IdOfProtectedResource.Mutex"); 
// create or open global semaphore 
int MoreThanMaxNumberOfReadersEver = 100; 

GlobalSemaphore semaphore = new GlobalSemaphore("IdOfProtectedResource.Semaphore", MoreThanMaxNumberOfReadersEver); 

public void AcquireReadLock() 
{ 
    mutex.Acquire(); 
    semaphore.Acquire(); 
    mutex.Release(); 
} 

public void ReleaseReadLock() 
{ 
    semaphore.Release(); 
} 

public void AcquireWriteLock() 
{ 
    mutex.Acquire(); 
    for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++) 
    semaphore.Acquire(); // drain out all readers-in-progress 
    mutex.Release(); 
} 

public void ReleaseWriteLock() 
{ 
    for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++) 
    semaphore.Release(); 
} 

대안은 다음과 같습니다

읽기 잠금 - 위와 같이.

- Lock mutex 
- Busy loop until the samaphore is not taken AT ALL: 
-- wait, release. 
-- Release returns value; 
-- if value N-1 then break loop. 
-- yield (give up CPU cycle) by using Sleep(1) or alternative 
- Do write 
- Release mutex 

보다 효율적인 접근 방식으로 여기에, 가능하다는 것을 주목해야합니다 : 단어에 대한 http://en.wikipedia.org/wiki/Readers-writers_problem#The_second_readers-writers_problem 봐 위의 기사에서 "이 솔루션은 최적이다"(의사)는 다음과 같이 잠금 작성합니다.

-1

System.Threading.Mutex에는 프로세스 내 통신에 사용할 수있는 뮤텍스가 있습니다. 지원하지 않는 기능을 원하면 뮤텍스를 통해 구현할 수 있습니다.

+1

읽기/쓰기 뮤텍스를 구현하는 샘플을 알고 있습니까? – Jeremy

+0

이 사람은 실제로 불가능하다고 말합니다 : http://stackoverflow.com/questions/1008726/win32-read-write-lock-using-only-critical-sections –

+0

@PavelRadzivilovsky 그 질문은 그것이 없이는 할 수 없다고 말합니다. 뮤텍스 (mutex)와 같은 적어도 하나의 커널 레벨 객체를 사용합니다. – McKay

-2

System.Threading.ReaderWriteLock을 보았습니까? 여기에 MSDN 링크가 있습니다.

+1

그건 교차 프로세스가 아닙니다 – Zippit

+1

아. 질문을 의심스럽게 생각합니다 (여전히 커피 한잔). 나는 이것을 몇 분 동안 그대로두고 그것을 삭제할 것이다. – AllenG

5

Windows에는 교차 프로세스 Reader-Writer 잠금이 없습니다. Semaphore와 Mutex를 조합하여 사용할 수 있습니다 (Mutex는 독점적 액세스를 위해 작가가 보유하거나 판독기가 Semaphore를 사용하여 다른 판독기를 해제합니다 — 즉 뮤텍스와 판독기를 기다리는 작가) .

그러나 경합이 낮을 것으로 예상되는 경우 (즉, 스레드가 장시간 잠금을 유지하지 못하는 경우) 상호 배타가 더 빨라질 수 있습니다. 리더기 잠금 장치의 추가 복잡성으로 인해 여러 명의 판독기를 허용하는 이점을 누릴 수 있습니다. 상당한 시간 동안 많은 판독기와 잠금 장치가있는 경우에만 reader-writer 잠금이 더 빨라지지만 프로파일 링 만이이를 확인할 수 있습니다.)

+0

+1 성능 노트 –