代码之家  ›  专栏  ›  技术社区  ›  Jim Mischel

避免.NET代码中的ABA问题

  •  8
  • Jim Mischel  · 技术社区  · 15 年前

    请注意,我已经知道并理解 ABA problem . 这个问题是关于.NET内存模型对于ABA的行为。

    在他的讨论中 Lock-Free LIFO Stack (2007年5月《msdn杂志》的clr由内向外专栏),Joe Duffy说:

    “每次推送都会产生一个对象分配,避免我们担心所谓的ABA问题。”

    然后,他简要地描述了ABA问题,并提到这可能发生在本机C/C++中,因为内存分配器只要释放一个地址就可以重用。

    一切都很好。但是,是什么使.NET程序不受ABA问题的影响呢?他是否暗示,由于不能立即重用节点(即,在节点超出范围和GC收集节点之间存在延迟),因此不可能发生ABA问题?如果是这样,这是一个安全的断言吗?

    我将第一个承认我不知道.NET内存分配器或垃圾收集器的所有复杂性,但我有限的理解使我相信引用 可以是 重复使用。如果有一个引用可以重用的可能性,那么这是否使得ABA问题成为可能,如果确实非常不可能的话?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Curt Hagenlocher    15 年前

    如果一个线程1在内存地址X处有一个对象引用,那么根据定义,线程2所做的任何事情都不会导致另一个对象使用相同的地址。对象仍然是活动的,在没有对它的引用保留之前,它的地址不会被重用。这保证了——当联锁交换操作返回我们期望的值时——ABA问题没有发生。