- 论坛徽章:
- 0
|
今天搜到一个用mutex和条件变量实现读写锁的代码。- #include <pthread.h>
- struct rwlock {
- pthread_mutex_t lock;
- pthread_cond_t read, write;
- unsigned readers, writers, read_waiters, write_waiters;
- };
- void reader_lock(struct rwlock *self) {
- pthread_mutex_lock(&self->lock);
- if (self->writers || self->write_waiters) {
- self->read_waiters++;
- do pthread_cond_wait(&self->read, &self->lock);
- while (self->writers || self->write_waiters);
- self->read_waiters--;
- }
- self->readers++;
- pthread_mutex_unlock(&self->lock);
- }
- void reader_unlock(struct rwlock *self) {
- pthread_mutex_lock(&self->lock);
- self->readers--;
- if (self->write_waiters)
- pthread_cond_signal(&self->write);
- pthread_mutex_unlock(&self->lock);
- }
- void writer_lock(struct rwlock *self) {
- pthread_mutex_lock(&self->lock);
- if (self->readers || self->writers) {
- self->write_waiters++;
- do pthread_cond_wait(&self->write, &self->lock);
- while (self->readers || self->writers);
- self->write_waiters--;
- }
- self->writers = 1;
- pthread_mutex_unlock(&self->lock);
- }
- void writer_unlock(struct rwlock *self) {
- pthread_mutex_lock(&self->lock);
- self->writers = 0;
- if (self->write_waiters)
- pthread_cond_signal(&self->write);
- else if (self->read_waiters)
- pthread_cond_broadcast(&self->read);
- pthread_mutex_unlock(&self->lock);
- }
- void rwlock_init(struct rwlock *self) {
- self->readers = self->writers = self->read_waiters = self->write_waiters = 0;
- pthread_mutex_init(&self->lock, NULL);
- pthread_cond_init(&self->read, NULL);
- pthread_cond_init(&self->write, NULL);
- }
复制代码 很好的解决了,如果存在写锁等待,就不再增加读锁的问题。但这样处理会存在另一个问题,就是如果总是有一个以上写锁等待,读锁就会“饿死”。
请问有什么解决读锁“饿死”的方法吗? |
|