Можно смоделировать блокировку чтения / записи, используя Mutex и семафор. Я бы не стал этого делать, если бы мне приходилось обращаться к нему тысячи раз в секунду, но для десятков или, может быть, сотен раз в секунду он должен работать просто отлично.
Эта блокировка позволила бы монопольный доступ 1 писателя или одновременный доступ N (возможно, большим, но вы должны определить это) читателей.
Вот как это работает. Я буду использовать 10 читателей в качестве примера.
Инициализирует именованный мьютекс, изначально не сигнализированный и именованный семафор с 10 слотами:
Mutex m = new Mutex(false, "MyMutex");
Semaphore s = new Semaphore(10, 10, "MySemaphore");
Получить блокировку считывателя:
// Lock access to the semaphore.
m.WaitOne();
// Wait for a semaphore slot.
s.WaitOne();
// Release mutex so others can access the semaphore.
m.ReleaseMutex();
Снять блокировку считывателя:
s.Release();
Получить блокировку писателя:
// Lock access to the seamphore
m.WaitOne();
// Here we're waiting for the semaphore to get full,
// meaning that there aren't any more readers accessing.
// The only way to get the count is to call Release.
// So we wait, then immediately release.
// Release returns the previous count.
// Since we know that access to the semaphore is locked
// (i.e. nobody can get a slot), we know that when count
// goes to 9 (one less than the total possible), all the readers
// are done.
s.WaitOne();
int count = s.Release();
while (count != 9)
{
// sleep briefly so other processes get a chance.
// You might want to tweak this value. Sleep(1) might be okay.
Thread.Sleep(10);
s.WaitOne();
count = s.Release();
}
// At this point, there are no more readers.
Отпустить блокировку писателя:
m.ReleaseMutex();
Несмотря на то, что хрупкий (каждый процесс, использующий это, лучше иметь одинаковый номер для счетчика семафоров!), Я думаю, он будет делать то, что вы хотите, если вы не пытаетесь ударить его слишком сильно.