자원

2011-04-20 4 views
0
for (int i = 0; i < 100; i++) 
{ 
     // If current thread needs resource(i) then 

     Mutex mutex = new Mutex(false, "Mutex" + i.ToString()); 
     mutex.WaitOne(); 

     // synchronized access to resource(i) 

     mutex.ReleaseMutex(); 
} 

우리는 100 개 자원을 보유하고 각 동시에 단일 스레드에서 액세스해야 당 동기화 된 액세스라는 이름의 mutexs에 대한 대체 (가 리소스에 액세스 OK입니다 [2] 및 자원 [5] 동시에) 그래서 위 코드를 사용했습니다. 이 시나리오에서 명명 된 뮤텍스에 대한 최선의 대안은 무엇입니까?자원

답변

2

이것이 모두 단일 프로세스 인 경우 명명 된 뮤텍스가 필요하지 않습니다. N 객체의 목록이나 배열을 만들고 lock을 사용하면됩니다.

const int NumLocks = 100; 
List<object> LockObjects = new List<object>(NumLocks); 

// to initialize 
for (int i = 0; i < NumLocks; ++i) 
{ 
    LockObjects.Add(new object()); 
} 

// and your loop 
for (int i = 0; i < NumLocks; ++i) 
{ 
    // if current thread needs lock[i] then 
    lock(LockObjects[i]) 
    { 
     // do whatever you need to do 
     // and then release the lock 
    } 
} 

또는 개별 리소스 개체를 잠글 수 있습니다. 그들이 정말로 물건이라면. "리소스"는 메소드 또는 객체 그룹 일 수 있기 때문에 별도의 잠금 객체를 사용하는 것이 이해하고 유지하기가 쉽다는 것을 알게되었습니다. 잠금 객체는 나를 이해하는 데 도움이되는 추상화입니다.

여러 프로세스에서이 작업이 필요한 경우 Mutex을 사용하는 것 이외의 좋은 해결책이 없습니다. 그러나, 나는 그 프로그램의 시작과 그 주위에 그들을 유지 Mutex 개체의 목록을 만드는 것이 좋습니다. 그런 식으로, 루프에서 당신이해야 할 일은 모두 WaitOne입니다 - 루프 안에 매번 객체를 생성 할 필요가 없습니다.

+0

사실 리소스에는 인덱스가 없습니다. 그것들은 고유 한 이름을 가지므로'resource (i) '보다는'resource [key]'가 있고 어떤 유형이 잠금으로 사용하기에 적합한가? – Xaqron

+0

내가 게시 한 솔루션을 사용하고 잠금 목록에'List '을 사용할 것을 제안합니다. 따라서'resource [key]'를 사용하기 위해서는'LockObjects [key]'를 잠급니다. 'key'가 순차적 인 정수가 아니라면, 잠금을위한'Dictionary '를 빌드하십시오. 잠금 개체와 리소스 사이에 일대일 관계가있는 한 괜찮습니다. –

1

리소스가 참조 클래스의 인스턴스라고 가정하면 각 리소스를 잠급니다.

var r = resource(i); 
lock (r) 
{ 
    // synchronized access to resource(i) 
} 
+0

불행히도 자원은'게으른 개체 '이고 불필요하게 깨우지 않는 것을 선호하지만 아이디어는 창조적입니다. – Xaqron