免费注册 查看新帖 |

Chinaunix

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

一个关于pthread的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-16 16:34 |只看该作者 |倒序浏览
现有一个变量a,一个线程W偶尔需要修改它的值,n个线程需要读取a。需要同时满足以下条件
1. W修改a时,其它线程不能读取a;当有线程读取a时,W不能修改a;当W没有修改a时,其它线程可同时读取a。
2. 一些线程需要监视a是否大于某个值THRESHOLD,如超过了,需要相应执行一些特定操作。

为实现1,我设置了一个pthread_rwlock_t lock。为实现2,我打算设置一个pthread_cond_t cr。code如下

#include <pthread.h>

int a;
pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;

int read (){
    int v;
    pthread_rwlock_rdlock( &lock);
    v =a ;
    pthread_rwlock_unlock( &lock);
    return v;
}

int write (c){
    pthread_rwlock_wrlock( &lock);
    a =c ;
    pthread_rwlock_unlock( &lock);
    pthread_cond_broadcast( &cv);
    return 0;
}

void monitor () {
    pthread_rwlock_rdlock( &lock);
    while(a <= THRESHOLD)
       pthread_cond_wait(&cv, &lock);
    pthread_rwlock_unlock( &lock);

   // 执行相关的操作

    return 0;
}

在上面的code中,由于pthread_cond_wait似乎只接收mutex而非wrlock,所以monitor函数编译无法通过。是不是需要再设置一个mutex值啊?但设置这个mutex值好像比较麻烦,也不知道怎么设。大侠们有没什么好的办法啊? 多谢。




}

[ 本帖最后由 yacare 于 2007-7-17 12:18 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-16 16:42 |只看该作者
只有修改的时候去加锁修改这个变量

其它线程读的时候只要判断加没加锁,如果没加就可以同时读.

论坛徽章:
0
3 [报告]
发表于 2007-07-16 16:44 |只看该作者
wrlock也应该是用mutex实现的吧
UNP第二卷上有代码
在Linux上使用wrlock要有一个宏

论坛徽章:
0
4 [报告]
发表于 2007-07-16 23:24 |只看该作者
原帖由 linternt 于 2007-7-16 16:42 发表
只有修改的时候去加锁修改这个变量

其它线程读的时候只要判断加没加锁,如果没加就可以同时读.



我需要让那些尝试读失败了的线程block一直到可以读为止。如果让线程一直尝试着读会非常浪费资源。。。。同时,如果读线程不加锁,如何让写线程在有读线程在操作的时候不进行写操作啊?

论坛徽章:
0
5 [报告]
发表于 2007-07-16 23:26 |只看该作者
原帖由 cugb_cat 于 2007-7-16 16:44 发表
wrlock也应该是用mutex实现的吧
UNP第二卷上有代码
在Linux上使用wrlock要有一个宏


我觉得rwlock应该也是用mutex来实现的,但在调用pthread_cond_wait的时候,编译器提示需要用mutex而非rwlock。

论坛徽章:
0
6 [报告]
发表于 2007-07-17 12:19 |只看该作者
顶,哪位大侠帮忙解答一下啊?谢谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP