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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Advanced Programming in UNIX Environment Episode 54
下一篇:Advanced Programming in UNIX Environment Episode 52

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月30日 08时19分53秒