Login
Задачка на синхронизацию
2446 просмотров
Перейти к просмотру всей ветки
in Antwort 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);
}
}
}
}
}