免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1296 | 回复: 0
打印 上一主题 下一主题

linux上pthread多线程写锁优先的一个实现.doc [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-10 16:23 |只看该作者 |倒序浏览

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP