免费注册 查看新帖 |

Chinaunix

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

[算法] 关于APUE的互斥量范例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-09 16:23 |只看该作者 |倒序浏览
APUE已经看到线程同步了,但对其范例却很困惑

  1. Figure 11.12. Simplified locking
  2. #include <stdlib.h>
  3. #include <pthread.h>

  4. #define NHASH 29
  5. #define HASH(fp) (((unsigned long)fp)%NHASH)   //这个有参宏HASH有什么作用?

  6. struct foo *fh[NHASH];
  7. pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;

  8. struct foo {
  9.     int             f_count; /* protected by hashlock */
  10.     pthread_mutex_t f_lock;
  11.     struct foo     *f_next; /* protected by hashlock */
  12.     int             f_id;
  13.     /* ... more stuff here ... */
  14. };

  15. struct foo *
  16. foo_alloc(void) /* allocate the object */
  17. {
  18.     struct foo  *fp;
  19.     int         idx;

  20.     if ((fp = malloc(sizeof(struct foo))) != NULL) {
  21.         fp->f_count = 1;
  22.         if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
  23.             free(fp);
  24.             return(NULL);
  25.         }
  26.         idx = HASH(fp);
  27.         pthread_mutex_lock(&hashlock);
  28.         fp->f_next = fh[idx];
  29.         fh[idx] = fp->f_next;         //这两句没看明白,书上解释的也不详细,只说了将新结构添加到散列存储桶中
  30.         pthread_mutex_lock(&fp->f_lock);
  31.         pthread_mutex_unlock(&hashlock);
  32.         /* ... continue initialization ... */
  33.     }
  34.     return(fp);

  35. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2008-01-09 16:53 |只看该作者
BS一下自己,忘了BAIDU,GOOGLE了

http://www.cnblogs.com/yfcomeon/archive/2007/10/31/943805.html
这里有一篇散列的文章,先看去了

论坛徽章:
0
3 [报告]
发表于 2008-01-09 18:20 |只看该作者
原帖由 xi2008wang 于 2008-1-9 16:23 发表
APUE已经看到线程同步了,但对其范例却很困惑

Figure 11.12. Simplified locking
#include
#include

#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)   //这个有参宏HASH有什么作用? ...


那句话很简单,你在纸上一画就清楚了。
实际上,相同的hashval的,总是挂在一个hash slot上,内部用链表串起来,
每次新增一个,总是把新增的节点放在链表头,也就是说,之前的链表挂到新增节点的next域上。
这么做,避免了每次都要遍历到链表尾部在挂入。
好像 C语言编程  那本最最经典的书上,讲hash部分,就是这个算法。

论坛徽章:
0
4 [报告]
发表于 2008-01-09 18:35 |只看该作者

回复 #3 ivhb 的帖子

谢了.

论坛徽章:
0
5 [报告]
发表于 2008-01-09 18:45 |只看该作者
这个属于数据结构基础问题了.

论坛徽章:
0
6 [报告]
发表于 2008-01-09 18:57 |只看该作者

回复 #5 converse 的帖子


数据结构的书我还没看呢....

论坛徽章:
0
7 [报告]
发表于 2008-03-19 16:47 |只看该作者
我也觉得这两句有问题, fh[idx]存放链表头地址,
fp->f_next=fh[idx] 将fp->f_next指向的链表头,
接着的fh[idx] = fp->f_next  又将fh[idx]指向了原来的链表头,
这个过程中fh[idx]值并没有改变, 仅仅完成了将fp->f_next指向表头, 以后的使用中不能通过fh[idx]找到
这个fp。(链表中并没有指针指向新分配的fp)

是不是应该将fh[idx] = fp->f_next改为fh[idx]=fp

论坛徽章:
0
8 [报告]
发表于 2008-07-17 09:38 |只看该作者
原帖由 xi2008wang 于 2008-1-9 16:23 发表
APUE已经看到线程同步了,但对其范例却很困惑

Figure 11.12. Simplified locking
#include
#include

#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)   //这个有参宏HASH有什么作用? ...


这个宏的意思是产生一个0-28直接的随机数.
那么插入的位置是不是就有问题啦?

论坛徽章:
0
9 [报告]
发表于 2008-07-17 12:47 |只看该作者
链表而已,应该拿笔画一下

论坛徽章:
0
10 [报告]
发表于 2008-07-17 21:58 |只看该作者

回复 #9 gawk 的帖子

还是不理解这个宏,高手指点下.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP