- 论坛徽章:
- 0
|
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);
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/88055/showart_1712835.html |
|