Link Search Menu Expand Document

Readers-writers locks

In the starter code, we provide you with a working implementation of a readers-writers lock, should you choose to use it. The API for the lock is defined in threads/synch.h, and is shown below for convenience.

/* Readers-writers lock. */
#define RW_READER 1
#define RW_WRITER 0

struct rw_lock {
  struct lock lock;
  struct condition read, write;
  int AR, WR, AW, WW;
};

void rw_lock_init(struct rw_lock*);
void rw_lock_acquire(struct rw_lock*, bool reader);
void rw_lock_release(struct rw_lock*, bool reader);

You can initialize a readers-writers lock with the rw_lock_init function, which mirrors the standard lock_init function. Unlike a standard lock, you may acquire a readers-writers lock in either reader mode or writer mode, which is specified by bool reader.. You can use the definitions of RW_READER and RW_WRITER for cleaner code. One example usage (for a readers lock on the stack) is shown below:

void demo_rw_lock_function() {
    // Allocate bytes for rw_lock on the stack
    struct rw_lock my_rw_lock;

    // Initialize the RW lock
    rw_lock_init(&my_rw_lock);
    
    // Acquire RW lock in reader mode
    rw_lock_acquire(&rw_lock, RW_READER);
    
    // Release RW lock in reader mode
    rw_lock_release(&rw_lock, RW_READER);
}