프로세스 전체에서 작동하는 읽기/쓰기 잠금 메커니즘이 있습니까 (Mutex와 비슷하지만 독점 잠금 대신 읽기/쓰기)? 동시 읽기 액세스를 허용하려고하지만 독점 쓰기 액세스를 허용하려고합니다..NET에서 크로스 프로세스 읽기 - 쓰기 동기화 원시.
답변
아니요. 리차드가 위에서 언급 한 것처럼 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 봐 위의 기사에서 "이 솔루션은 최적이다"(의사)는 다음과 같이 잠금 작성합니다.
System.Threading.Mutex에는 프로세스 내 통신에 사용할 수있는 뮤텍스가 있습니다. 지원하지 않는 기능을 원하면 뮤텍스를 통해 구현할 수 있습니다.
Windows에는 교차 프로세스 Reader-Writer 잠금이 없습니다. Semaphore와 Mutex를 조합하여 사용할 수 있습니다 (Mutex는 독점적 액세스를 위해 작가가 보유하거나 판독기가 Semaphore를 사용하여 다른 판독기를 해제합니다 — 즉 뮤텍스와 판독기를 기다리는 작가) .
그러나 경합이 낮을 것으로 예상되는 경우 (즉, 스레드가 장시간 잠금을 유지하지 못하는 경우) 상호 배타가 더 빨라질 수 있습니다. 리더기 잠금 장치의 추가 복잡성으로 인해 여러 명의 판독기를 허용하는 이점을 누릴 수 있습니다. 상당한 시간 동안 많은 판독기와 잠금 장치가있는 경우에만 reader-writer 잠금이 더 빨라지지만 프로파일 링 만이이를 확인할 수 있습니다.)
+1 성능 노트 –
크로스 프로세스 또는 크로스 스레드? –
@Albin - 교차 프로세스. – Jeremy
해결책을 찾았습니까? – Bipul