我遇到了微软提供的这种一次性模式的实现:https ://msdn.microsoft.com/en-us/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++ 类,并且我想delete
在处置 C# 类时使用 C++ 对象以确保正确释放我的非托管资源。我添加了一个函数DestructNative(self)
,它基本上delete (CppObject*)self
对关联的 C++ 对象进行本机 C++ 调用。所以我的代码如下所示:
// 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;
}
Dispose(false)
所以我的问题是,知道可以从不同的线程调用 C# 终结器,我是否需要在 C++ 对象的析构函数中提供同步,以确保从 C# 终结器调用时没有任何竞争条件?
附加问题
微软一次性模式坏了吗?似乎disposed
标志是一个简单的变量,如果从不同的线程调用终结器,则该变量不同步。