免费注册 查看新帖 |

Chinaunix

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

[C] apue(第三版)11章多线程互斥量链表的例子搞晕了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-15 10:00 |只看该作者 |倒序浏览
本帖最后由 keenboa 于 2014-09-15 10:06 编辑

书上的代码:
#include <stdlib.h>
#include <pthread.h>
#define NHASH 29
#define HASH(id) (((unsigned long)id)%NHASH)
struct foo *fh[NHASH];
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;
struct foo {
        int f_count;
        pthread_mutex_t f_lock;
        int f_id;
        struct foo *f_next; /* protected by hashlock */
/* ... more stuff here ... */
};
struct foo *
foo_alloc(int id) /* allocate the object */
{
        struct foo *fp;
        int idx;
        if ((fp = malloc(sizeof(struct foo))) != NULL) {
                fp->f_count = 1;
                fp->f_id = id;
                if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
                        free(fp);
                        return (NULL);
                }
                idx = HASH(id);  /*这里id只要是小于29,那结果idx=id吧?*/
                pthread_mutex_lock(&hashlock);
                fp->f_next = fh[idx]; /*fh只是在前面声明了一下,fh[idx]应该是NULL吧?。*/
                fh[idx] = fp; /*fh[idx]->f_next就也应该是空吧?网上说是把新项插入头节点,但fh[idx]->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;
        pthread_mutex_lock(&hashlock);
        for (fp = fh[HASH(id)]; 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->f_id);
                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);
        }
}

疑问如上面程序中的注释,我做了一个循环:

int main(void) {
        int t = 0;
        while (t < NHASH) {
                 foo_alloc(t);
                printf("%d:%d:%d\n", t, fh[t]->f_next, fh[t] ) ;
                t++;
        }
   return 0;

}

结果是fh数组里面的所有成员的fp->f_next都是NULL,这链表也没有链起来啊?

fp->f_next = fh[idx];
fh[idx] = fp; 网上说是把新项插入头节点,但fh[idx]->f_next都是空的呀,没链起来呀。

还是我理解错了,foo_alloc不是这样用的吗?





论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:29:50
2 [报告]
发表于 2014-09-15 12:35 |只看该作者
fh[idx]就是头结点

论坛徽章:
0
3 [报告]
发表于 2014-09-15 14:05 |只看该作者
回复 2# qshllxfx
您是说它这个例子没错吗?是我理解错了?能详细一点解答一下我的疑问吗?谢谢!

   

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:29:50
4 [报告]
发表于 2014-09-15 17:02 |只看该作者
初始
    fh[idx](0)
增加一个节点fp1
    fh[idx](fp1) -->  fp1->f_next(0)
增加第二个相同hash id的节点fp2
    fh[idx](fp2)  -->  fp2->f_next(fp1) --> fp1->f_next(0)

括号里的是指针的值

论坛徽章:
0
5 [报告]
发表于 2014-09-16 09:29 |只看该作者
回复 4# qshllxfx
明白了,主要是对散列的概念没理解对,谢谢。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP