linux上pthread多线程写锁优先的一个实现
2007-12-24 21:12
为了解决写饥饿的问题,利用条件变量实现了一个写锁优先的读写锁。 /* * *******************************设计思路*********************************** * 用一个全局变量的表示写线程的个数,所有后于写线程的读线 * 程等待一个cont,即写线程计数为0。 ********************************性能评价************************************ * RH-2.6.9-5.EL下,默认设置下我最多可以开305个线程 * tt使用的为默认锁,rdwr_starve为下面的写优先锁 * 两者都是先开一个读线程,然后50个写线程,依次50个读线程 * 50个写线程、50个读线程,50个写线程。效率没有什么影响。 * [buffalo@jingle pthread]$ time ./tt * real 0m0.328s * user 0m0.013s * sys 0m0.166s * * [buffalo@jingle pthread]$ time ./tt * real 0m0.869s * user 0m0.018s * sys 0m0.317s * * [buffalo@jingle pthread]$ time ./rdwr_starve * real 0m0.311s * user 0m0.011s * sys 0m0.181s * * [buffalo@jingle pthread]$ time ./rdwr_starve * real 0m0.340s * user 0m0.011s * sys 0m0.196s */
#include
#ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 500 /* 支持读写锁 */ #endif
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t wait = PTHREAD_COND_INITIALIZER; static int WRITING; /* 写线程计数 */
int wrap_pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) { int err;
pthread_mutex_lock(&lock);//锁住全局变量,一次只许一个写线程自加 ++WRITING; pthread_mutex_unlock(&lock); err = pthread_rwlock_wrlock (rwlock);
if (err) { pthread_mutex_lock(&lock);//锁住全局变量,一次只许一个写线程自加 --WRITING;//申请写锁失败,计数减一 pthread_mutex_unlock(&lock); return err; }
return 0; }
int wrap_pthread_rwlock_wunlock (pthread_rwlock_t *rwlock) { int err;
pthread_mutex_lock(&lock); --WRITING; err = pthread_rwlock_unlock (rwlock); if (err) { ++WRITING;/* 解锁失败 */ pthread_mutex_unlock(&lock); return err; } if (WRITING == 0) pthread_cond_broadcast(&wait);//告诉所有等待的读线程,你们的机会来了 //这里有一个race condition。 //如果有新的写线程置WRITING并抢到了锁,reader继续等 //如果有新的写线程置WRITING并没有抢到锁,writer阻塞于申请写锁,其他的后于 //writer的reader,看到WRITING不为0,阻塞于pthread_cont_wait(),实现写锁优先。 pthread_mutex_unlock(&lock); return 0; } int wrap_pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) { int err;
pthread_mutex_lock(&lock); while (WRITING) pthread_cond_wait(&wait, &lock);//有写线程,我等. pthread_mutex_unlock(&lock);
return pthread_rwlock_rdlock (rwlock); }
int wrap_pthread_rwlock_runlock (pthread_rwlock_t *rwlock) { return pthread_rwlock_unlock (rwlock); |
阅读(1115) | 评论(0) | 转发(0) |