프레임 워크에서 잠금 메커니즘을 수행해야하는 클래스를 구현해야합니다. 우리는 여러 스레드를 가지고 있으며 0,1,2,3 번으로 번호가 매겨져 있습니다. 우리는 ResourceHandler
이라는 정적 클래스를 가지고 있습니다. 요구 사항은 n Lock()
호출이 m Release()
호출에 의해 재실행되어야한다는 것입니다. 여기서 n = [0 ..] 및 m = [0 ..]입니다. 따라서 단일 객체에서 얼마나 많은 잠금이 수행 되더라도 하나의 Release()
호출만으로 모두 잠금을 해제 할 수 있습니다. 객체가 잠겨 있지 않은 경우에도 Release()
호출은 아무 것도 수행하지 않아야합니다. 또한 어떤 스레드에서 어떤 객체가 잠겨 있는지를 알아야합니다.다중 잠금 작업 (스레딩)
public class ResourceHandler
{
private readonly Dictionary<int, List<object>> _locks = new Dictionary<int, List<object>>();
public static ResourceHandler Instance {/* Singleton */}
public virtual void Lock(int threadNumber, object obj)
{
Monitor.Enter(obj);
if (!_locks.ContainsKey(threadNumber)) {_locks.Add(new List<object>());}
_locks[threadNumber].Add(obj);
}
public virtual void Release(int threadNumber, object obj)
{
// Check whether we have threadN in _lock and skip if not
var count = _locks[threadNumber].Count(x => x == obj);
_locks[threadNumber].RemoveAll(x => x == obj);
for (int i=0; i<count; i++)
{
Monitor.Exit(obj);
}
}
// .....
}
는 사실 내가 여기에 스레드 안전성 약 걱정 무엇 :
나는이 구현이있다. 저는 실제로 확실하지 않습니다. thread-safe인지 아닌지, 그리고 그것을 고치는 것은 정말 고통 스럽습니다. 작업을 올바르게 수행하고 스레드 안전성을 보장 할 수있는 방법은 무엇입니까?
하나의 스레드가 다른 스레드를 중지 시키거나 threadN 현재 스레드의 수라고 생각합니까? – Kek
threadN은 현재 스레드의 번호입니다. 잠금 및 릴리스는 Monitor.Enter/Exit가 스레드를 잠 그거나 해제해야하지만 많은 잠금에 대한 규칙 (많은 릴리스가 만족되어야합니다)을 수행해야합니다. 또한 개체를 잠글 수 있고 스레드 번호를 알고 있어야합니다 (각 스레드에 대한 정리가 있습니다. 모든 개체가 finally 블록에서 해제되어 응용 프로그램이 중지 될 때 모든 잠금이 해제되도록 할 수 있습니다) – Archeg
threadN을 threadNumber로 변경했습니다. – Archeg