+ -
当前位置:首页 → 问答吧 → 关于互斥量《APUE》

关于互斥量《APUE》

时间:2010-07-05

来源:互联网

本帖最后由 blackgenius 于 2010-07-05 18:08 编辑

CU的高手们,请指教一下APUE里面的一段关于互斥量的程序,本人菜鸟,无法理解,请求指点:
其中有两句,真不知道什么意思,
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
请指点迷津
  1. #include <stdlib.h>
  2. #include <pthread.h>

  3. #define NHASH 29
  4. #define HASH(fp) (((unsigned long)fp)%NHASH)

  5. struct foo *fh[NHASH];

  6. pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;

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

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

  19.         if ((fp = malloc(sizeof(struct foo))) != NULL) {
  20.                 fp->f_count = 1;
  21.                 if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
  22.                         free(fp);
  23.                         return(NULL);
  24.                 }
  25.                 idx = HASH(fp);
  26.                 pthread_mutex_lock(&hashlock);
  27.                 fp->f_next = fh[idx];
  28.                 fh[idx] = fp->f_next;
  29.                 pthread_mutex_lock(&fp->f_lock);
  30.                 pthread_mutex_unlock(&hashlock);
  31.                 /* ... continue initialization ... */
  32.                 pthread_mutex_unlock(&fp->f_lock);
  33.         }
  34. return(fp);
  35. }

  36. void
  37. foo_hold(struct foo *fp) /* add a reference to the object */
  38. {
  39.         pthread_mutex_lock(&fp->f_lock);
  40.         fp->f_count++;
  41.         pthread_mutex_unlock(&fp->f_lock);
  42. }

  43. struct foo *
  44. foo_find(int id) /* find an existing object */
  45. {
  46.         struct foo      *fp;
  47.         int                     idx;

  48.         idx = HASH(fp);
  49.         pthread_mutex_lock(&hashlock);
  50.         for (fp = fh[idx]; fp != NULL; fp = fp->f_next) {
  51.                 if (fp->f_id == id) {
  52.                         foo_hold(fp);
  53.                         break;
  54.                 }
  55.         }
  56.         pthread_mutex_unlock(&hashlock);
  57.         return(fp);
  58. }

  59. void
  60. foo_rele(struct foo *fp) /* release a reference to the object */
  61. {
  62.         struct foo      *tfp;
  63.         int                     idx;

  64.         pthread_mutex_lock(&fp->f_lock);
  65.         if (fp->f_count == 1) { /* last reference */
  66.                 pthread_mutex_unlock(&fp->f_lock);
  67.                 pthread_mutex_lock(&hashlock);
  68. pthread_mutex_lock(&fp->f_lock);
  69.                 /* need to recheck the condition */
  70.                 if (fp->f_count != 1) {
  71.                         fp->f_count--;
  72.                         pthread_mutex_unlock(&fp->f_lock);
  73.                         pthread_mutex_unlock(&hashlock);
  74.                         return;
  75.                 }
  76.                 /* remove from list */
  77.                 idx = HASH(fp);
  78.                 tfp = fh[idx];
  79.                 if (tfp == fp) {
  80.                         fh[idx] = fp->f_next;
  81.                 } else {
  82.                         while (tfp->f_next != fp)
  83.                                 tfp = tfp->f_next;
  84.                         tfp->f_next = fp->f_next;
  85.                 }
  86.                 pthread_mutex_unlock(&hashlock);
  87.                 pthread_mutex_unlock(&fp->f_lock);
  88.                 pthread_mutex_destroy(&fp->f_lock);
  89.                 free(fp);
  90.         } else {
  91.                 fp->f_count--;
  92.                 pthread_mutex_unlock(&fp->f_lock);
  93.         }
  94. }
  95.                                                                                                                                            105,1        底端
复制代码

作者: blackgenius   发布时间: 2010-07-05

fp->f_next = fh[idx];
fh[idx] = fp->f_next;
这个写错了,应为:
fp->f_next = fh[idx];
fh[idx] = fp;

另外,find那个算法也错了

作者: liwangli1983   发布时间: 2010-07-05

回复 liwangli1983
谢谢指点啊~我菜鸟一个,自己是没法发现这些错误的~

作者: blackgenius   发布时间: 2010-07-05

回复 liwangli1983


    能帮忙解释下
           idx = HASH(fp);

                pthread_mutex_lock(&hashlock);

                fp->f_next = fh[idx];

                fh[idx] = fp;

                pthread_mutex_lock(&fp->f_lock);

                pthread_mutex_unlock(&hashlock);

                /* ... continue initialization ... */

                pthread_mutex_unlock(&fp->f_lock);
这段代码是什么意思?谢谢啦啊

作者: 单眼皮大姐   发布时间: 2010-07-05