Deutsch

Задачка на синхронизацию

24.02.24 19:37
Re: Задачка на синхронизацию
 
NightWatch коренной житель
NightWatch
в ответ Fleitist 23.02.24 20:19

Что-то типа этого?

public class MyClass
{
  private readonly Synchronization sync = new Synchronization();

  public void MethodA()
  {
    sync.EnterParallel();
    try {
      // body
    } finally {
      sync.ExitParallel();
    }
  }

  public void MethodB()
  {
    sync.EnterParallel();
    try {
      // body
    } finally {
      sync.ExitParallel();
    }
  }

  public void MethodC()
  {
    sync.Enter();
    try {
      // body
    } finally {
      sync.Exit();
    }
  }

  public void MethodD()
  {
    sync.Enter();
    try {
      // body
    } finally {
      sync.Exit();
    }
  }

  public void MethodE()
  {
    sync.Enter();
    try {
      // body
    } finally {
      sync.Exit();
    }
  }

  private class Synchronization
  {
    private readonly object syncRoot = new object();
    private readonly object counterSync = new object();
    private int counter = 0;

    public void Enter()
    {
      Monitor.Enter(syncRoot);
    }

    public void EnterParallel()
    {
      lock (counterSync) { 
        if (counter < 1) {
          Monitor.Enter(syncRoot);
        }
        counter++;
      }
    }

    public void Exit()
    {
      Monitor.Exit(syncRoot);
    }

    public void ExitParallel()
    {
      lock (counterSync) {
        counter--;
        if (counter < 1) {
          Monitor.Exit(syncRoot);
        }
      }
    }
  }
}
 

Перейти на