使用互斥量

Henryinferno 2014-03-15 04:42:25
以下是《Unix 环境高级编程》中的一个实例:
这个例子用以描述两个互斥量的使用方法。当同时使用两个互斥量时,总是让他们用相同的顺序加锁,以避免死锁。第二个互斥量维护一个用于追踪foo数据结构的散列列表。这样hashlock互斥量保护foo数据结构中的fh散列表和f_next散列链字段。foo结构中的f_lock互斥量保护对foo结构中的其他字段访问。
#include <stdlib.h>
#include <pthread.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; /* 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 */
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) {
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);
}
}

...全文
247 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucky-lucky 2014-03-29
  • 打赏
  • 举报
回复
引用 3 楼 wsx199397 的回复:
[quote=引用 2 楼 zhxianbin 的回复:]
程序中这两条语句: fp->f_next = fh[idx]; fh[idx] = fp->f_next; 不就是相当于 a=b; b=a; 这样赋值有意义吗[/quote] 你的代码是错的,我翻了翻书,里面的代码是这样:

fp->f_next = fh[idx];
fh[idx] = fp;
lucky-lucky 2014-03-29
  • 打赏
  • 举报
回复
引用 5 楼 wsx199397 的回复:
[quote=引用 4 楼 p569354158 的回复:] [quote=引用 3 楼 wsx199397 的回复:] [quote=引用 2 楼 zhxianbin 的回复:]
程序中这两条语句: fp->f_next = fh[idx]; fh[idx] = fp->f_next; 不就是相当于 a=b; b=a; 这样赋值有意义吗[/quote] 你的代码是错的,我翻了翻书,里面的代码是这样:

fp->f_next = fh[idx];
fh[idx] = fp;
[/quote] 我这书居然印刷是错的[/quote] 哈哈,我看的是第二版,中文翻译版就是太坑爹了,有些文献就不是搞IT的人翻译的,你说能翻译好吗
Henryinferno 2014-03-29
  • 打赏
  • 举报
回复
引用 4 楼 p569354158 的回复:
[quote=引用 3 楼 wsx199397 的回复:] [quote=引用 2 楼 zhxianbin 的回复:]
程序中这两条语句: fp->f_next = fh[idx]; fh[idx] = fp->f_next; 不就是相当于 a=b; b=a; 这样赋值有意义吗[/quote] 你的代码是错的,我翻了翻书,里面的代码是这样:

fp->f_next = fh[idx];
fh[idx] = fp;
[/quote] 我这书居然印刷是错的
Henryinferno 2014-03-28
  • 打赏
  • 举报
回复
引用 2 楼 zhxianbin 的回复:
程序中这两条语句: fp->f_next = fh[idx]; fh[idx] = fp->f_next; 不就是相当于 a=b; b=a; 这样赋值有意义吗
zhxianbin 2014-03-27
  • 打赏
  • 举报
回复
Henryinferno 2014-03-26
  • 打赏
  • 举报
回复

18,829

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧