gpt4 book ai didi

c# - IDisposable 与析构函数 : requires thread-safe implementation?

转载 作者:行者123 更新时间:2023-11-30 14:18:18 25 4
gpt4 key购买 nike

这几乎只是为了让我确定,我做对了:

我们有一个实现 IDisposal 模式的大型资源类。它应该(按设计)以一种方式实现,使其能够被多次调用(当然,即使我们尝试恰好调用它一次)。我们还实现了一个终结器,它也调用 Dispose() 方法——就像备份一样。如果手动调用,Dispose() 也会调用 GC.SuppressFinalize(this)。

周围有几个处理模式的例子。他们中的大多数在处理代码的结尾 调用GC.SuppressFinalize(this)。有人声称,在 Dispose() 方法的开头调用它会更好,任何清理之前。后者争辩说,这将确保 GC 不会在我们仍在清理时同时调用终结器。

问题:
看来,把 GC.SuppressFinalize 放在最前面并没有更好的效果?我们仍然有竞争条件,对吗?那么,我们宁愿以线程安全的方式实现 Dispose() 是真的吗?

最佳答案

GC 只清理那些“不可达”的对象。

正在执行代码的类仍然是“可访问的”,因为它是 this指针在堆栈上。因此,在执行 dispose 时,不会调用终结器。

<罢工>

所以你打 SuppressFinalize也没关系在开头或结尾。

正如下面的评论者所指出的,CLR 实现似乎无法保证您的对象在实例方法执行时不会被垃圾收集/终结。使对象保持事件状态的唯一可能的“可靠”引用是用于调用对象方法的引用,但我对 JIT 内部结构的了解还不够多,无法就此发表声明,而且它的行为可能会改变。

我将答案留在此处以访问下面的讨论。

关于c# - IDisposable 与析构函数 : requires thread-safe implementation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com