제한된 리소스 세트가 포함 된 "Manager"클래스를 만들었습니다. 자원은 "Manager"에 대기열로 저장됩니다. 큐와 세마포어를 동일한 크기로 초기화하고, 사용 가능한 리소스가없는 경우 세마포어를 사용하여 스레드를 차단합니다. 리소스를 요청하기 위해이 클래스를 호출하는 여러 스레드가 있습니다. 다음은 가짜 코드입니다.세마포어 경쟁 조건?
public IResource RequestResource()
{
IResource resource = null;
_semaphore.WaitOne();
lock (_syncLock)
{
resource = _resources.Dequeue();
}
return resource;
}
public void ReleaseResource(IResource resource)
{
lock (_syncLock)
{
_resources.Enqueue(resource);
}
_semaphore.Release();
}
이 응용 프로그램을 실행하는 동안 잠시 동안 제대로 실행되는 것 같습니다. 그런 다음, 내 큐가 같은 대상을 내고있는 것 같습니다. 이것이 가능한 것처럼 보입니까? 나는 내 머리카락을 끌어 당기고 있으며 어떤 도움도 크게 감사 할 것입니다. 필요할 경우 언제든지 자세한 정보를 요청하십시오. 감사!
pls를 다시 포맷하고 이것을 호출하는 코드를 제공 할 수 있습니까? –
예, 죄송합니다. 탭에 붙여 넣은 다음 원래 미리보기에서 제대로 보였다고 생각했습니다. – poindexter12
대기열 크기가 변경되면 변경됩니까? 객체가 다른 스레드에서도 동일합니까? 전화 패턴은 무엇입니까? Enqueue와 Dequeue가 예외를 throw 했습니까 (버그가 있습니다.) 디버깅을 시도 했습니까? –