亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: APUE中線程鎖的問題 [打印本頁]

作者: DNFCF    時間: 2011-04-10 13:48
標(biāo)題: APUE中線程鎖的問題
本帖最后由 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);
        }
}

代碼中,紅色部分求指點
作者: DNFCF    時間: 2011-04-10 14:25
怎么沒人回一下,給自己頂一下
作者: sjtlqy    時間: 2011-04-10 14:40
我?guī)湍沩斏先?img src="static/image/smiley/default/em02.gif" smilieid="71" border="0" alt="" />
作者: DNFCF    時間: 2011-04-10 14:47
回復(fù) 3# sjtlqy


    謝謝
作者: yulihua49    時間: 2011-04-10 17:56
#include
#include

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

struct foo ...
DNFCF 發(fā)表于 2011-04-10 13:48



  環(huán)形鏈表。
作者: lwrsmy    時間: 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;
作者: DNFCF    時間: 2011-04-10 18:44
fp->f_next = fh;//
   fh = fp->f_next;//想不通這兩句是什么意思,第二句貌似是多余的吧???求指點

...
lwrsmy 發(fā)表于 2011-04-10 18:06



    贊同。。
作者: ydfgic    時間: 2011-04-12 13:40
這兩句寫反了
你自己想想




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2