Блокировка-бесплатного подсчета ссылок

Я работаю над системой, которая требует обширного взаимодействия с 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
      }
    }
  }
}

. Это прекрасно работает и позволяет достичь поставленной цели. Однако, поскольку любая операция взаимодействия должна быть вложена в блок using FooEnvironment, мы постоянно блокируемся, и профилирование предполагает, что на эту блокировку приходится почти 50% работы, выполняемой во время выполнения-. Мне кажется, что это достаточно фундаментальная концепция, и что-то в.NET или CLR должно решать ее. Есть ли лучший способ сделать подсчет ссылок?

6
задан Marc 9 April 2012 в 13:53
поделиться