------------------------------------------------------------------------------
MC logo
Reader/Writer Operations
[^] Process and Thread Synchronization
------------------------------------------------------------------------------
readerwriter.h
#include "semaphore.h"

/*
 * This class provides the reader and writer lock controls using semaphores
 * as described in the text.
 */
class readerwriter {
public:
        readerwriter(): m_readcount(0), m_writesem(1), m_mutex(1) { }

        /*
         * Operations to synchronize readers and writers.
         */
        void enter_read()
        {
                // This locks the mutex until it is destroyed at method exit.
                m_mutex.down();
                if(++m_readcount == 1) m_writesem.down();
                m_mutex.up();
        }

        void leave_read()
        {
                m_mutex.down();
                if(--m_readcount == 0) m_writesem.up();
                m_mutex.up();
        }

        void enter_write()
        {
                m_writesem.down();
        }

        void leave_write()
        {
                m_writesem.up();
        }

private:
        int m_readcount;
        semaphore m_mutex;
        semaphore m_writesem;
};