Win32 Read/Write Lock Using Only Critical Sections

前端 未结 10 1345
攒了一身酷
攒了一身酷 2020-12-14 12:20

I have to implement a read/write lock in C++ using the Win32 api as part of a project at work. All of the existing solutions use kernel objects (semaphores and mutexes) tha

10条回答
  •  粉色の甜心
    2020-12-14 12:55

    I wrote the following code using only critical sections.

    class ReadWriteLock {
        volatile LONG writelockcount;
        volatile LONG readlockcount;
        CRITICAL_SECTION cs;
    public:
        ReadWriteLock() {
            InitializeCriticalSection(&cs);
            writelockcount = 0;
            readlockcount = 0;
        }
        ~ReadWriteLock() {
            DeleteCriticalSection(&cs);
        }
        void AcquireReaderLock() {        
        retry:
            while (writelockcount) {
                Sleep(0);
            }
            EnterCriticalSection(&cs);
            if (!writelockcount) {
                readlockcount++;
            }
            else {
                LeaveCriticalSection(&cs);
                goto retry;
            }
            LeaveCriticalSection(&cs);
        }
        void ReleaseReaderLock() {
            EnterCriticalSection(&cs);
            readlockcount--;
            LeaveCriticalSection(&cs);
        }
        void AcquireWriterLock() {
            retry:
            while (writelockcount||readlockcount) {
                Sleep(0);
            }
            EnterCriticalSection(&cs);
            if (!writelockcount&&!readlockcount) {
                writelockcount++;
            }
            else {
                LeaveCriticalSection(&cs);
                goto retry;
            }
            LeaveCriticalSection(&cs);
        }
        void ReleaseWriterLock() {
            EnterCriticalSection(&cs);
            writelockcount--;
            LeaveCriticalSection(&cs);
        }
    };
    

    To perform a spin-wait, comment the lines with Sleep(0).

提交回复
热议问题