2013-01-14 1 views
1

다음 특정 잠금 순서가 있습니다. 나는 현재 순차적으로 수행되는 작업을 수행하기 위해 쓰레드 풀을 작성 중이다.스레드 풀 구현에서 잠금 순서 유지

잠금 순서는 pool-> queue-> job입니다.

그러나 때로는 작업 상태를 확인하기 위해 작업을 잠근 다음 작업을 한 큐에서 다른 큐로 이동하도록 큐를 잠글 필요가 있습니다. 그래서, 잠금 순서를 따라 난이 얻을 :

lock job 

if (job->state == CANCELED) { 
unlock job 
lock queue 
lock job 
// check that it is still canceled and do work 
} 

내 질문이있다 잠금 해제/잠금 작업이없는이 작업을 수행하는 다른 방법이? 잠금 주문을 보관해야하며 '상위 키'잠금이 필요한 경우 어떻게 처리할까요?

+0

작업을 잠금 해제하기 전에 작업을 대기열로 옮길 수 있습니까? – andre

답변

2

여러분은 대기열에서 try-lock을 할 수 있다고 생각합니다. 성공하면 잠금과 계속할 수 있습니다. 실패한 경우 다른 사용자가 이미 대기열 잠금 기능을 가지고 있으며 작업 잠금을 기다리고 있는지 여부를 알 수 없으므로 대기열에서 차단 잠금을 수행하기 전에 먼저 작업 잠금 해제를 수행해야합니다. 그렇지 않으면 교착 상태에 빠질 수 있습니다.

는 다음 코드 이제까지 교착하지 않습니다 생각 : 시도 잠금이 (가 성공했을 경우 순서가 옳은 성공인지 아닌지

lock(job); 
if (job->state == CANCELED) { 
    if (!tryLock(queue)) { 
     // Cannot lock queue; must avoid dead lock 
     unlock(job); 
     lock(queue); // This one might block now 
     lock(job); 
    } 
    if (job->state == CANCELED) { 
     // Do work 
    } 
    unlock(queue); 
} 
unlock(job); 

당신은, 잠금 따라 서로 다른 순서로 큐 작업을 잠금 해제 할 수 있습니다 , 그렇지 않으면 틀린), 아직 나는 아직도 교착 상태가되지 않을 것이라고 생각한다.

+0

아, 이건 아주 우아한 해결책이라고 생각합니다. 고맙습니다! – wlformyd