-
데드락(Deadlock)과 라이브락(Livelock)프로그래밍/기록, 개념, 용어 2015. 2. 5. 02:17반응형
데드락과 라이브락
데드락(Deadlock)
데드락은 스레드들이 서로 상대방이 가진 자원을 기다리느라 전혀 진도를 나가지 못하는 상황이다.
두 개의 뮤텍스 락 A, B를 모두 획득하려는 두 개의 스레드를 예를 들어보자.
스레드0이 락A를 스레드1이 락B를 각각 획득한 상태라면 스레드0은 B를 확보할 수가 없어 작업 진행을 할 수 없고,
스레드1은 락A를 확보할 수 없어 작업을 진행하지 못한다.
Thread0
void update()
{
획득(A)
획득(B) // 스레드0은 여기서 무한 대기
어떤작업()
해제(B)
해제(A)
}
Thread1
void update()
{
획득(B)
획득(A) // 스레드1은 여기서 무한 대기
어떤작업()
해제(A)
해제(B)
}
라이브락(Livelock)
라이브락은 두 스레드가 락의 해제와 획득을 무한 반복하는 상태이다.
라이브락은 데드락을 피하려는 의도에서 수정한 코드가 불완전할 때 발생하곤 한다.
Thread0
int done = 0;
while(!done)
{
획득(A)
if(획득시도(B) == true)
{
어떤작업()
해제(B)
해제(A)
done = 1;
}
else
{
해제(A)
}
}
Thread1
while(!done)
{
획득(B)
if(획득시도(A) == true)
{
어떤작업()
해제(A)
해제(B)
done = 1;
}
else
{
해제(B)
}
}
두 스레드가 같은 시점에 구동된다면 라이브락에 걸려 뮤텍스를 획득하고 해제하는 반복 루프에 빠지게되어 어느 스레드도 작업을 진행할 수 없게 된다.
반응형'프로그래밍 > 기록, 개념, 용어' 카테고리의 다른 글
[스크랩] Graceful Shutdown에 관하여 (0) 2015.07.11 반환값 최적화 RVO, NRVO (0) 2015.03.01 데이터 레이스(Data Race) (0) 2015.02.05 뮤텍스(Mutex)와 크리티컬 리전/섹션(Critical Region/Section) (0) 2015.02.05 원자적 조작과 락-프리 코드(Atomic operation & Lock-Free code) (0) 2015.02.05