8

プロセス間で機能する読み取り/書き込みロック メカニズムはありますか (Mutex に似ていますが、排他ロックではなく読み取り/書き込み)? 同時読み取りアクセスを許可したいのですが、書き込みアクセスは排他的です。

4

6 に答える 6

5

Windowsには、クロスプロセスのリーダーライターロックは含まれていません。セマフォとMutexの組み合わせを使用して、1つを構築できます(Mutexは、排他的アクセスのためにライターによって保持されるか、Semaphoreを使用して他のリーダーを解放するリーダーによって保持されます。つまり、ライターはミューテックスとリーダーのいずれかのみを待機します) 。

ただし、競合が少ないと予想される場合(つまり、スレッドがロックを長時間保持しない場合)、相互排除はさらに高速になる可能性があります。リーダーライターロックの複雑さが増すと、複数のリーダーを許可するメリットが失われます。(リーダーライターより多くのリーダーがあり、ロックがかなりの時間保持されている場合にのみ、ロックが高速になりますが、これを確認できるのはプロファイリングのみです。)

于 2010-08-17T15:55:06.200 に答える
5

いいえ。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 上記の記事で「このソリューションは最適ではない」という言葉を探してください。

于 2013-02-26T15:56:07.817 に答える
-1

System.Threading.Mutex には、プロセス内通信に使用できるミューテックスがあります。サポートされていない機能が必要な場合は、ミューテックスを介して実装できます。

于 2010-08-17T15:05:17.867 に答える
-4

あなたは見ましたSystem.Threading.ReaderWriteLockか?これがMSDNリンクです。

于 2010-08-17T15:05:21.003 に答える