我正在开发一个需要大量 C API 互操作的系统。部分互操作需要在任何操作之前和之后初始化和关闭相关系统。不这样做将导致系统不稳定。我通过简单地在核心一次性环境类中实现引用计数来实现这一点,如下所示:
public FooEnvironment()
{
lock(EnvironmentLock)
{
if(_initCount == 0)
{
Init(); // global startup
}
_initCount++;
}
}
private void Dispose(bool disposing)
{
if(_disposed)
return;
if(disposing)
{
lock(EnvironmentLock)
{
_initCount--;
if(_initCount == 0)
{
Term(); // global termination
}
}
}
}
这工作正常并实现了目标。但是,由于任何互操作操作都必须嵌套在 FooEnvironment using 块中,因此我们一直在锁定,分析表明这种锁定占运行时完成工作的近 50%。在我看来,这是一个足够基本的概念,.NET 或 CLR 中的某些东西必须解决它。有没有更好的方法来做引用计数?