プロセス間で機能する読み取り/書き込みロック メカニズムはありますか (Mutex に似ていますが、排他ロックではなく読み取り/書き込み)? 同時読み取りアクセスを許可したいのですが、書き込みアクセスは排他的です。
6 に答える
Windowsには、クロスプロセスのリーダーライターロックは含まれていません。セマフォとMutexの組み合わせを使用して、1つを構築できます(Mutexは、排他的アクセスのためにライターによって保持されるか、Semaphoreを使用して他のリーダーを解放するリーダーによって保持されます。つまり、ライターはミューテックスとリーダーのいずれかのみを待機します) 。
ただし、競合が少ないと予想される場合(つまり、スレッドがロックを長時間保持しない場合)、相互排除はさらに高速になる可能性があります。リーダーライターロックの複雑さが増すと、複数のリーダーを許可するメリットが失われます。(リーダーライターより多くのリーダーがあり、ロックがかなりの時間保持されている場合にのみ、ロックが高速になりますが、これを確認できるのはプロファイリングのみです。)
いいえ。Richard が前述したように、.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 には、プロセス内通信に使用できるミューテックスがあります。サポートされていない機能が必要な場合は、ミューテックスを介して実装できます。
あなたは見ましたSystem.Threading.ReaderWriteLock
か?これがMSDNリンクです。