美文网首页
一种引用计数+锁的设计思路

一种引用计数+锁的设计思路

作者: Jiafu | 来源:发表于2017-12-14 21:13 被阅读0次

在设计并发系统的时候,常常有这么一个问题,例如我们有一个业务1,需要更新A,B,C三个对象,然后有另外一个业务2,要删除B对象。

这两个不同的业务,如果并发的话,很容易出现问题。例如在业务1进行到一半的时候,如果业务2突然把B删掉,那么可能导致业务1出现奇怪的异常。

引用计数可以用来解决这个问题。在B对象的结构体中,放入以下字段:

u32_t refcnt; // 引用计数
spinlock_t lock; // 保护计数和标志
u8_t flag; // 标志位,标志对象是否有效
void (*obj_final) (void *private);
void *private;

约定,只要对象的引用计数不为0,那么代表对象存活,且对象所在的拓扑是稳定的。例如,如果对象被放在一个红黑树里,只要对象的引用不为0,业务就可以放心地使用这个对象,并且认为对象始终在这个红黑树中。

在对象创建出来后,引用计数为1。在业务1更新B之前,需要获取B的指针,此时B的引用计数至少为1,因此也就可以保证B肯定不会被删除。

业务2在删除B对象的时候,同样首先要拿到B的指针,并将其减1。如果减1后,计数为0,那么说明没有其它业务在引用这个对象,将flag置为无效对象,然后做删除相关的业务(例如将对象从红黑树中移除)。如果引用计数不为0,说明当前有其它业务正在使用这个对象,这时业务2就设置好obj_final回调函数和private回调参数。

业务1使用完B对象后,将其计数减1。如果计数为0,那么将flag标志置为无效对象,代表对象B已经无效了。并且调用obj_final回调函数,obj_final会做业务2真正想做的删除业务,此时已经没有业务可以再访问到对象B了,对象B可以被安全删除。

简单的思路就是这样。

相关文章

  • 一种引用计数+锁的设计思路

    在设计并发系统的时候,常常有这么一个问题,例如我们有一个业务1,需要更新A,B,C三个对象,然后有另外一个业务2,...

  • 设计引用计数

    应用范围 1:多个对象同时操作某一个对象的时候 2:需要随时获取有多少对象在引用同一个对象的时候 3:等等。。 好...

  • 垃圾回收复习

    存活判断算法 引用计数算法(Reference Counting) 最简单的一种算法,基本思路是这样的:给对象中添...

  • 第五章 内存管理(EffectiveObjective-C)

    1 理解引用计数 每个对象有个可增可将的计数器,ARC实际上也是一种引用计数机制, 引用计数工作原理OC对象有个"...

  • iOS内存管理初探 – 引用计数、AutoRelease与ARC

    引用计数式内存管理 引用计数 iOS通过引用计数管理对象的生命周期,每个对象有其引用计数。 对象被强引用时引用计数...

  • Obj-C高级编程--内存管理

    自动引用计数 自动引用计数:指内存管理中对引用采取自动计数的技术。 内存管理/引用计数 持有对象引起引用计数加...

  • 【C++】智能指针类和OpenCV的Ptr模板类

    智能指针类 引用计数 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference ...

  • (一) 垃圾回收器

    一、引用计数器 引用计数是一种简单但速度很慢的垃圾回收技术。 创建的每一个对象都有一个与之相关联的引用计数...

  • GC算法

    引用计数 每个对象有一个引用计数,当对象被多引用一次,引用计数加一,当引用被释放,引用计数减一,当引用计数为零,则...

  • 内存管理与自动引用计数—第一日

    自动引用计数 1.1 什么是自动引用计数 内存管理中对引用采用自动计数的计数 1.2 内存管理/引用计数 这一张举...

网友评论

      本文标题:一种引用计数+锁的设计思路

      本文链接:https://www.haomeiwen.com/subject/qzylwxtx.html