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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3070 | 回復(fù): 7
打印 上一主題 下一主題

APUE中線程鎖的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 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 [報告]
發(fā)表于 2011-04-10 14:25 |只看該作者
怎么沒人回一下,給自己頂一下

論壇徽章:
0
3 [報告]
發(fā)表于 2011-04-10 14:40 |只看該作者
我?guī)湍沩斏先?img src="static/image/smiley/default/em02.gif" smilieid="71" border="0" alt="" />

論壇徽章:
0
4 [報告]
發(fā)表于 2011-04-10 14:47 |只看該作者
回復(fù) 3# sjtlqy


    謝謝

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期: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 [報告]
發(fā)表于 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)形鏈表。

論壇徽章:
0
6 [報告]
發(fā)表于 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 [報告]
發(fā)表于 2011-04-10 18:44 |只看該作者
fp->f_next = fh;//
   fh = fp->f_next;//想不通這兩句是什么意思,第二句貌似是多余的吧???求指點

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



    贊同。。

論壇徽章:
0
8 [報告]
發(fā)表于 2011-04-12 13:40 |只看該作者
這兩句寫反了
你自己想想
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP