我发现了微软提供的可抛弃模式的实现:https://msdn.microsoft.com/zh-cn/library/system.idisposable(v=vs.110).aspx
using System;
class BaseClass : IDisposable
{
// Flag: Has Dispose already been called?
bool disposed = false;
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
// Free any other managed objects here.
//
}
// Free any unmanaged objects here.
//
disposed = true;
}
~BaseClass()
{
Dispose(false);
}
}
假设我有一个与这个C#类相关联的C++类,并且我想在处理C#类时删除
C++ 对象,以确保我的未托管资源被正确释放。我添加了一个函数 DestructNative(self)
,它基本上会在关联的C++对象上进行原生的C++调用delete (CppObject*)self
。因此,我的代码如下:
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
// Free any other managed objects here.
//
}
DestructNative(self);
disposed = true;
}
我的问题是,由于知道C#终结器可以从不同的线程调用,我是否需要在C++对象的析构函数中提供同步以确保在从C#终结器调用Dispose(false)
时没有任何竞争条件?
附加问题
微软的可处理模式是否有问题?似乎disposed
标志是一个简单的变量,如果从不同的线程调用终结器,则不会进行同步。