#include #include #include typedef struct rw_lock{ atomic_int reader_count; sem_t writer_semaphore; pthread_mutex_t count_sem_guard; } rw_lock_t; void write_lock(rw_lock_t *l){ sem_wait(&l->writer_semaphore); } void write_unlock(rw_lock_t *l){ sem_post(&l->writer_semaphore); } void read_lock(rw_lock_t *l){ pthread_mutex_lock(&l->count_sem_guard); if (atomic_fetch_add(&l->reader_count,1) == 0) write_lock(l); pthread_mutex_unlock(&l->count_sem_guard); } void read_unlock(rw_lock_t *l){ if (atomic_fetch_add(&l->reader_count,-1) == 0) //is this racy? Let's think! write_unlock(l); } typedef struct rw_lock_writer{ } rw_lock_writer_t ; int main(){ }