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

unix环境高级编程 线程同步这章 源代码的问题??

    来源: 互联网  发布时间:2016-07-01

    本文导语:  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)...

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);
}

以上就是源码的片段, 但我不明白        
        pthread_mutex_lock(&fp->f_lock);           
        pthread_mutex_unlock(&hashlock);
        pthread_mutex_unlock(&fp->f_lock);
为什么要怎么写,还没等hashlock解锁,就给&fp->f_lock加锁,而且还怎么都不做就解锁了,这个实例是避免死锁了实例片段。请高手帮我分析分析呗!!!!!谢谢!!
       

|
第一个问题书上有解释吧。

pthread_mutex_lock(&hashlock);        
        fp->f_next = fh[idx]; 
        fh[idx] = fp->f_next;
到这一步把新的结点加到全局的hash表中。此时新的结点对其它线程来说是可见的。
如果下一步是
pthread_mutex_unlock(&hashlock);
解锁后,其它线程可以取得该结点并进行其它一些操作。但是该结点并没初始化完就
被其它线程使用,有违背题目的意思。因此特意在解锁之前锁住另一个锁,避免其它
线程对该结点的其它数据进行修改。

第二个问题似乎是书上的问题:
 fp->f_next = fh[idx]; 
    fh[idx] = fp->f_next;
题目意思是把fp加入这个链表中。
感觉应该是:
 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上用多线程还是多进程开发程序好?
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 恳切请教:如何学习unix源代码
  • 我能读懂UNIX源代码
  • 哪有 UNIX环境高级编程 第2版 源代码 ????(急急~~~~)
  • 大家推荐几本详解Linux或unix 操作系统源代码的书籍!!!!
  • 求教,关于莱昂氏UNIX系统源代码的阅读
  • 请问谁有UNIX虚拟机的源代码!
  • 求unix或者linux的shell源代码
  • 《UNIX环境高级编程(第2版)》这本书的源代码哪里可以下载啊?
  • 《莱昂氏UNIX源代码分析》中有一种结构体声明没有结构体名
  • Unix环境高级编程 源代码编译
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Unix下共享内存一个写N个读的进程同步与互斥
  • 进程间通信:pthread_cond使用在线程间,我要进程间条件同步(没有情缘关系的进程),采用什么方呢?也就是说我要在UNIX实现WIN32上命名Event的功能
  • 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问题,请专家快来!!!
  • UNIX支持中文否,请推荐UNIX好书
  • SCO UNIX 5.0用软盘启动之后无法启动UNIX
  • 散分!!unix 用户调查!!!你使用哪款unix
  • hp unix 和 sco unix的区别
  • 入门问题,我想向UNIX编程方向发展,单目前不会UNIX,我该如何做
  • 强烈建议将linux/Unix栏目放到“软件开发者”大类里面来。----Unix开发的人助威支持!!!
  • 现在那些unix比较流行?Linux和 Unix有 什么区别?
  • 小问题, Unix 如何建立一个文件 ,unix 文件有后缀名吗
  • 我想学习Unix,请高手给个下载网址,用linux来学习Unix差别大吗?
  • 请问各位unix大虾,哪有免费的unix下载?


  • 站内导航:


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

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

    浙ICP备11055608号-3