3

クラスをデザインしましたMemoryBlock。名前が示すように、それは(管理されていない)メモリのブロックです。私は単にそうするだけでvar x = new MemoryBlock (1024, 16)、1kBのメモリ(16バイトにアラインされます)が得られます。そのため、一部のスレッドは、安全でないコンテキストを使用してこのブロックに対して読み取り/書き込みを行います。SyncRootスレッドを同期するためにプロパティのようなことをしました。だから私はlock (myMemoryBlock.SyncRoot)記憶を使っていくつかのことをします。良いか悪いかはわかりませんが、このようなものをコレクションで見ました。
この単純なメカニズムでは、複数のスレッドがこのオブジェクトにアクセスすることはできません。書くことはできますが、読むには十分ではありません。私はこのようなものが欲しい:

1)スレッドがオブジェクトに書き込んでいる場合、他のスレッドはこのオブジェクトにアクセスできません
2)スレッドがオブジェクトから読み取っている場合、他の多くのスレッドはこのオブジェクトから読み取ることができますが、書き込むことはできません
3)オブジェクトが使用され、スレッドが書き込みを希望する場合、スレッドはオブジェクトが解放されるまで待機します
4)エキスパートモード:一部のスレッドがオブジェクトから読み取りを行っており、別のスレッドがオブジェクトに書き込みを行う場合、オブジェクトが解放されるまで待機しますが、オブジェクトに停止を指示して、読み取りたい新しいスレッドにアクセスできるようにしますこのオブジェクト(キュー)から。

コードを必要とせず、簡単なヒントをいただければ幸いです。

4

2 に答える 2

1

ReaderWriterLockSlimを見てください。基本的に、多くのリーダーが同時に読み取る必要がある場合に役立ちますが、ライターはすべてのリーダーをブロックする必要があります。読み取り/書き込み比が50:50の場合は、通常のlock(obj){}を使用します。

例:ReadWriteLockSlimはキャッシュに適しています。つまり、1秒あたりのリーダー数は多くなりますが、更新は5分ごとにキャッシュされます。

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

于 2012-12-28T02:13:23.193 に答える
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();
    }
}
于 2012-12-28T02:32:13.523 に答える