免费注册 查看新帖 |

Chinaunix

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

APUE中线程锁的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-10 13:48 |只看该作者 |倒序浏览
本帖最后由 DNFCF 于 2011-04-10 13:57 编辑

#include <stdlib.h>
#include <pthread.h>

#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)

struct foo *fh[NHASH];

pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;

struct foo {
        int             f_count;
        pthread_mutex_t f_lock;
        struct foo     *f_next; /* protected by hashlock */
        int             f_id;
        /* ... more stuff here ... */
};

struct foo *
foo_alloc(void) /* allocate the object */
{
        struct foo        *fp;
        int                        idx;

        if ((fp = malloc(sizeof(struct foo))) != NULL) {
                fp->f_count = 1;
                if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
                        free(fp);
                        return(NULL);
                }
                idx = HASH(fp);
                pthread_mutex_lock(&hashlock);
                fp->f_next = fh[idx];//
                fh[idx] = fp->f_next;//想不通这两句是什么意思,第二句貌似是多余的吧???求指点

                pthread_mutex_lock(&fp->f_lock);
                pthread_mutex_unlock(&hashlock);
                /* ... continue initialization ... */
                pthread_mutex_unlock(&fp->f_lock);
        }
        return(fp);
}

void
foo_hold(struct foo *fp) /* add a reference to the object */
{
        pthread_mutex_lock(&fp->f_lock);
        fp->f_count++;
        pthread_mutex_unlock(&fp->f_lock);
}

struct foo *
foo_find(int id) /* find an existing object */
{
        struct foo        *fp;
        int                        idx;

        idx = HASH(fp);
        pthread_mutex_lock(&hashlock);
        for (fp = fh[idx]; fp != NULL; fp = fp->f_next) {
                if (fp->f_id == id) {
                        foo_hold(fp);
                        break;
                }
        }
        pthread_mutex_unlock(&hashlock);
        return(fp);
}

void
foo_rele(struct foo *fp) /* release a reference to the object */
{
        struct foo        *tfp;
        int                        idx;

        pthread_mutex_lock(&fp->f_lock);
        if (fp->f_count == 1) { /* last reference */
                pthread_mutex_unlock(&fp->f_lock);
                pthread_mutex_lock(&hashlock);
                pthread_mutex_lock(&fp->f_lock);
                /* need to recheck the condition */
                if (fp->f_count != 1) {
                        fp->f_count--;
                        pthread_mutex_unlock(&fp->f_lock);
                        pthread_mutex_unlock(&hashlock);
                        return;
                }
                /* remove from list */
                idx = HASH(fp);
                tfp = fh[idx];
                if (tfp == fp) {
                        fh[idx] = fp->f_next;
                } else {
                        while (tfp->f_next != fp)
                                tfp = tfp->f_next;
                        tfp->f_next = fp->f_next;
                }
                pthread_mutex_unlock(&hashlock);
                pthread_mutex_unlock(&fp->f_lock);
                pthread_mutex_destroy(&fp->f_lock);
                free(fp);
        } else {
                fp->f_count--;
                pthread_mutex_unlock(&fp->f_lock);
        }
}

代码中,红色部分求指点

论坛徽章:
0
2 [报告]
发表于 2011-04-10 14:25 |只看该作者
怎么没人回一下,给自己顶一下

论坛徽章:
0
3 [报告]
发表于 2011-04-10 14:40 |只看该作者
我帮你顶上去

论坛徽章:
0
4 [报告]
发表于 2011-04-10 14:47 |只看该作者
回复 3# sjtlqy


    谢谢

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
5 [报告]
发表于 2011-04-10 17:56 |只看该作者
#include
#include

#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)

struct foo ...
DNFCF 发表于 2011-04-10 13:48



  环形链表。

论坛徽章:
0
6 [报告]
发表于 2011-04-10 18:06 |只看该作者
fp->f_next = fh[idx];//
   fh[idx] = fp->f_next;//想不通这两句是什么意思,第二句貌似是多余的吧???求指点

确实书中错了
原意是每次在hash队列头部插入下一元素
改为:
fp->f_next = fh[idx]->f_next;
fh[idx]->f_next = fp;

论坛徽章:
0
7 [报告]
发表于 2011-04-10 18:44 |只看该作者
fp->f_next = fh;//
   fh = fp->f_next;//想不通这两句是什么意思,第二句貌似是多余的吧???求指点

...
lwrsmy 发表于 2011-04-10 18:06



    赞同!!!

论坛徽章:
0
8 [报告]
发表于 2011-04-12 13:40 |只看该作者
这两句写反了
你自己想想
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP