对APUE第三版 第11章 11.6.1互斥量的疑问

Biniroad 2016-12-10 08:53:45
这一节的最后一段原话:

在这个例子中, 我们忽略了线程在调用 foo_hold 之前是如何找到的对线的. 如果有另一个线程在调用foo_hold 时阻塞等待互斥锁, 这时即使该对象引用计数为0, foo_rele 释放该对象的内存仍然是不对的. 可以通过确保对象在释放内存前不会被找到这种方式避免上述问题. 可以通过下面的例子来看看如何做到这一点.

例程:

struct foo{
#include<stdlib.h>
#include<pthread.h>

struct foo{
int f_count;
pthread_mutex_t f_lokc;
int f_id;
}

struct foo*
foo_alloc(int id){
struct foo *fp;
if ((fp = malloct(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);
}
}
return(fp);
}

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

void
foo_rele(struct foo *fp){
pthread_mutex_lock(&fp->f_lock);
if(--fp->f_count == 0){
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
}
else{
pthread_mutex_unlock(&fp->f_lock);
}
}


疑问:
初始化 f_count = 1;

确保对象在释放内存前不会被找到是什么意思, 上面的代码中是如何实现了这一点的..

如果两个线程都执行 foo_hold 和 foo_rele, 线程1优先级高, 先执行到了foo_rele 的 pthread_mutex_lock(&fp->f_lock);
此时 线程2 执行到 foo_hold 的 pthread_mutex_lock(&fp->f_lock); 此时线程2被阻塞.
那么线程1此时会摧毁这个锁, 那么线程2不就会内存访问出错了吗?
...全文
1130 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2016-12-12
  • 打赏
  • 举报
回复
看了一下原文,排版顺序是这样的, 1)先有这段(有问题的)代码(Fig. 11.10) 2)文字描述,最后一句话是We'll see how to do this in the examples that follow; 3)在后面的例子里,加入了hash表(对于忽略的how to find),在ref count为0的时候 ,先从hash表删除,再释放内存。(注意这个例子里引入了两个lock)
nswcfd 2016-12-12
  • 打赏
  • 举报
回复
分析的没有错,
引用
可以通过下面的例子来看看如何做到这一点.
不知道是不是翻译问题?
Biniroad 2016-12-11
  • 打赏
  • 举报
回复
求助~~~~
Biniroad 2016-12-10
  • 打赏
  • 举报
回复
求助呀!!!!!!!!!!!!!!!

2,161

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 UNIX文化
社区管理员
  • UNIX文化社区
  • 文天大人
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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