I have multiple asp.net web apps serving a set of files. Periodically, one will update the file before serving it, but it can’t update the file if it is in use.
I could solve this issue by using a named mutex where the name is the file path (replacing the invalid characters of course). I’ve used this in other situations, but you can see how inefficient it is. Only one process will be able to serve the file at a time.
A reader/writer lock would be perfect, but they are designed to work within a single process. Plus I’d have to create a reader/writer lock for every file that might get updated, and there are a lot.
What I really need is a reader/writer lock that can be named like a mutex. Is there such a thing? Or can such a thing be created using the existing locks?
It’s possible to simulate a reader/writer lock using a Mutex and a Semaphore. I wouldn’t do it if I had to access it thousands of times per second, but for dozens or perhaps hundreds of times per second, it should work just fine.
This lock would allow exclusive access by 1 writer or concurrent access by N (possibly large, but you have to define it) readers.
Here’s how it works. I’ll use 10 readers as an example.
Initialize a named Mutex, initially unsignaled, and a named Semaphore with 10 slots:
Acquire reader lock:
Release reader lock:
Acquire writer lock:
Release writer lock:
Although fragile (every process using this better have the same number for the semaphore count!), I think it will do what you want as long as you don’t try to hit it too hard.