zoukankan      html  css  js  c++  java
  • Unix系统编程_cha11.6_线程同步

    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.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;
        int f_id;
    };

    struct foo *foo_alloc(void){
        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
        }
        return (fp);
    }

    void foo_hold(struct foo *fp){
        pthread_mutex_lock(&hashlock);
        fp->f_count++;
        pthread_mutex_unlock(&hashlock);
    }

    struct foo *foo_find(int id){
        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){
                fp->f_count++;
                break;
            }
        }
        pthread_mutex_unlock(&hashlock);
        return (fp);
    }

    void foo_release(struct foo *fp){
        struct foo *tfp;
        int idx;

        pthread_mutex_lock(&hashlock);
        if(--fp->f_count == 0){
            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_destroy(&fp->f_lock);
                free(fp);
            }else {
                pthread_mutex_unlock(&hashlock);
            }
    }

    int main(void)
    {
        printf("Hello World! ");
        return 0;
    }

  • 相关阅读:
    Java 使用Calendar类输出指定年份和月份的日历
    ioc aop
    多线程下单例模式:懒加载(延迟加载)和即时加载
    Java生产环境下性能监控与调优详解
    springboot + zipkin + mysql
    springboot + zipkin(brave-okhttp实现)
    springboot启动方式
    OpenResty实现限流的几种方式
    RocketMQ核心技术精讲与高并发抗压实战
    codis 使用
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/5326707.html
Copyright © 2011-2022 走看看