Advanced Programming in UNIX Environment Episode 53
发布日期:2021-10-07 23:47:35
浏览次数:2
分类:技术文章
本文共 3844 字,大约阅读时间需要 12 分钟。
#include#include #define NHASH 29#define HASH(id) (((unsigned long)id)%NHASH)struct foo *fh[NHASH];pthread_mutex_t hashlock=PTHREAD_MUTEX_INITIALIZER;struct foo{ int f_count; pthread_mutex_t f_lock; int f_id; struct foo *f_next;};struct foo* foo_alloc(int id){ struct foo *fp; int idx; if((fp=malloc(sizeof(struct foo)))!=NULL) { fp->f_count=1; fp->f_id=id; if(pthread_mutex_init(&fp->f_lock, NULL)!=0) { free(fp); return NULL; } idx=HASH(id); pthread_mutex_lock(&hashlock); fp->f_next=fh[idx]; fh[idx]=fp; pthread_mutex_lock(&fp->f_lock); pthread_mutex_unlock(&hashlock); pthread_mutex_unlock(&fp->f_lock); } return fp;}void foo_hold(struct foo *fp){ pthread_mutex_lock(&fp->f_lock); fp->f_count++; pthread_mutex_unlock(&fp->f_lock);}struct foo *foo_find(int id){ struct foo *fp; pthread_mutex_lock(&hashlock) for(fp=fh[HASH(id)];fp!=NULL;fp=fp->next) { if(fp->f_id==id) { foo_hold(fp); break; } } pthread_mutex_unlock(&hashlock); return fp;}void foo_rele(struct foo *fp){ struct foo *tfp; int idx; pthread_mutex_lock(&fp->f_lock); if(fp->f_count==1) { pthread_mutex_unlock(&hashlock); pthread_mutex_lock(&hashlock); pthread_mutex_lock(&fp->f_lock); if(fp->f_count!=1) { fp->f_count--; pthread_mutex_unlock(&fp->f_lock); pthread_mutex_unlock(&hashlock); return; } idx=HASH(fp->f_id); 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); } }
Using two mutexes
#include#include #define NHASH 29#define HASH(id) (((unsigned long)id)%NHASH)struct foo *fh[NHASH];pthread_mutex_t hashlock=PTHREAD_MUTEX_INITIALIZER;struct foo{ int f_count; pthread_mutex_t f_lock; int f_id; struct foo *f_next;};struct foo* foo_alloc(int id){ struct foo *fp; int idx; if((fp=malloc(sizeof(struct foo)))!=NULL) { fp->f_count=1; fp->f_id=id; if(pthread_mutex_init(&fp->f_lock, NULL)!=0) { free(fp); return NULL; } idx=HASH(id); pthread_mutex_lock(&hashlock); fp->f_next=fh[idx]; fh[idx]=fp; pthread_mutex_lock(&fp->f_lock); pthread_mutex_unlock(&hashlock); pthread_mutex_unlock(&fp->f_lock); } return fp;}void foo_hold(struct foo *fp){ pthread_mutex_lock(&fp->f_lock); fp->f_count++; pthread_mutex_unlock(&fp->f_lock);}struct foo *foo_find(int id){ struct foo *fp; pthread_mutex_lock(&hashlock) for(fp=fh[HASH(id)];fp!=NULL;fp=fp->next) { if(fp->f_id==id) { foo_hold(fp); break; } } pthread_mutex_unlock(&hashlock); return fp;}void foo_rele(struct foo *fp){ struct foo *tfp; int idx; pthread_mutex_lock(&fp->f_lock); if(--fp->f_count==0) { idx=HASH(fp->f_id); tfp=fh[idx]; if(tfpp==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(&fp->f_lock); } }
Simplified locking
转载地址:https://blog.csdn.net/myfather103/article/details/79824172 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月30日 08时19分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【实战】深度学习构建人脸面部表情识别系统
2019-04-26
Python机器学习&数据分析-关联规则
2019-04-26
【实战】kaggle猫狗大战-卷积神经网络实现猫狗识别
2019-04-26
01 计算机视觉-opencv图像基本操作
2019-04-26
02 计算机视觉-opencv阈值与滤波处理
2019-04-26
03 计算机视觉-opencv图像形态学处理
2019-04-26
04计算机视觉-opencv图像梯度处理
2019-04-26
05计算机视觉-opencv边缘检测
2019-04-26
如何在junit中使用SpringFramework的Ioc容器
2019-04-26
一个案例教你理解Spring面向切面编程(Spring Aop)
2019-04-26
手把手教你整合SSM框架
2019-04-26
自己造个简单数据校验的注解@Value和@Mail
2019-04-26
Poj百练 4148:生理周期 (分类:枚举)
2019-04-26
Java如何读写注册表
2019-04-26
java如何利用模板文件生成word文档
2019-04-26
java读写xlsx格式的MS Excel文件
2019-04-26
vue的一些基础知识点
2019-04-26
webpack错误记录(不定期更新)
2019-04-26
Poj百练 2692:假币问题 (分类:模拟)
2019-04-26
SpringBoot实现一个文件上传服务
2019-04-26