Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51754
  • 博文数量: 35
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-10 10:44
文章存档

2011年(1)

2008年(34)

我的朋友
最近访客

分类: LINUX

2008-12-10 16:23:24

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) |
给主人留下些什么吧!~~