当前位置:  技术问答>linux和unix

关于UNIX高级环境编程2 中第11章线程死锁的例程代码,看不懂 望高手指点

    来源: 互联网  发布时间:2017-01-25

    本文导语:  本帖最后由 awangyong12345 于 2010-02-03 18:43:17 编辑 #include  #include  #define NHASH 29 #define HASH(fp) (((unsigned long)fp)%NHASH) // 请问这条语句的作用? struct foo *fh[NHASH]; pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER; struct foo ...

本帖最后由 awangyong12345 于 2010-02-03 18:43:17 编辑
#include 
#include 

#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 */  // 矛盾1
        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) {  //矛盾2
            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);
    }
}

请教大家一个问题 这是UNXI高级环境编程第11章 讲线程死锁 的例程  
有几个地方看不明白 想请问大家帮忙解释下 看不明白的地方已经注注释了 ,还有在foo_rele函数中 注释的矛盾1和矛盾2 两条语句 不是相互矛盾吗? 既然条件是 if(fp->f_count==1),那在它的嵌套里面为什么还有一个if(fp->f_count!=1),既然等于1才执行后面语句,那后面的!=1不是必然不成立的吗? 为什么还要写在这里?  请大家指教 谢谢大家

|
两个线程么,可能刚才还是1,一会再去测,已经不知啥时候被另一个线程给改成0了。

|


感觉这里应该是这个意思,但是代码是不是应该这样?

        fp->f_next = fh[idx]; 
         fh[idx] = fp; 



    
 
 

您可能感兴趣的文章:

  • 在unix下做webserver,使用多进程?多线程?
  • Unix的多线程问题
  • unix多线程数据传递问题
  • Unix中PThread是干什么用的,创建线程吗---小妹
  • 请问WINDOWS 和LINUX/UNIX 的进程、线程的区别
  • 在unix下如何编译多线程的程序?
  • UNIX下,什么函数可以取得当前线程ID?
  • unix下有多线程的概念吗,与fork的子进程有什么区别?
  • SCO UNIX 5.05下的线程软件包可以从哪里获得?(在线等待)
  • 看Unix环境高级编程,提到了V和bsd,有很多不同,但是没有提到Linux,请问linux跟BSD或者unix V 编程细节哪些不同的,特别是线程,进程,和socke
  • STL 在 UNIX 多线程 中不能用?
  • windows下面的线程代码怎么移植到unix下面去?
  • UNIX线程共用一个变量,出现core dump
  • 谁能给一个linux/unix下多线程同步的例子
  • UNIX的多线程技术一知半解,有没有好的书籍资料推荐?
  • 帮忙介绍适合于SCO UNIX 5。05版本的多线程包的下载地址(最好是成功的安装过)
  • Unix domain socket可用于同一个进程中的不同线程么?
  • 帮忙怎样写有关 unix下的线程的问题(在线等待,急用,谢谢)
  • UNIX中多个线程同时捕捉信号,信号由那个线程捕捉到?
  • unix/linux上用多线程还是多进程开发程序好?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 听说freebsd很强大,但我发现好像是unix的。。可我现在想学linux。。unix/linux有什么区别。。请高人指点
  • Unix有前途吗?请高手们指点迷津
  • 想学UNIX,准备买书了,有经验的达人指点下,
  • hp-unix下,我用ftp软件打开hp-unix的时候目录不显示文件,我记得是用ROOT用户设置一下什么init.d什么的,但是忘记了,请知道的朋友指点!
  • 高手指点关于在UNIX方面的发展
  • 小弟刚开始学习UNIX 编成 。哪个高手指点一下推荐一本编成书。最好电子版
  • 下一步该学习linux/unix的什么?请高手指点……
  • Unix与Windows的困惑,希望得到各位大虾的指点
  • UNIX 无法登陆,望高手们指点
  • =====UNIX 启动的文件加载,请指点=========
  • 想搞一下windows以外的操作系统,不知道Unix和Linux那个好一点,那个有前途,请大虾指点
  • 高手指点,unix下有什么样的工具可以对程序进行汉化???答者有分
  • 请Unix编程高手指点
  • 请问在UNIX环境高级编程这书里面引用的一个头文件,多谢指点。
  • 按步骤装完了unix,最后提示我安装完成,可是当重新启动的时候不能进入系统,提示 "NO OS",各位给指点一下
  • 想转入linux/unix下开发,还请各位指点
  • 请高人指点:在unix下,如何实现二值信号量
  • 如何在Linux或Unix中获得硬件资源信息?希望各位指点迷津!!!
  • 高手指点 hp unix的find命令和solaris的find命令 区别
  • 我是一位非计算机专业的研究生,想学习unix系统、网络管理员,并获得sun公司的认证证书,以后想从事unix环境下的开发工作,请各位指点一下,有没有可能?
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • php将unix时间戳转换成字符串时间函数(date)
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • UNIX特急!!!digital unix问题,请专家快来!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3