멀티스레드 애플리케이션의 교착 상태
교착 상태의 발생
멀티스레드 애플리케이션에서는 여러 스레드가 동시에 실행되며 공유 자원(예: 뮤텍스 락)을 획득하려고 할 때 교착 상태가 발생할 수 있습니다1.
책의 예시에서는 두 개의 뮤텍스 락(
first_mutex
, second_mutex
)을 사용하고, 두 스레드(thread_one
, thread_two
)가 각각 다른 순서로 이 락을 획득하려 합니다2.
thread_one
:first_mutex
→second_mutex
순서로 획득을 시도합니다.thread_two
:second_mutex
→first_mutex
순서로 획득을 시도합니다.
만약
thread_one
이 first_mutex
를 획득한 직후, thread_two
가 second_mutex
를 획득한다면 교착 상태가 발생합니다3. 각 스레드는 상대방이 가진 락을 기다리게 되어, 어떤 스레드도 더 이상 진행할 수 없게 됩니다.
livelock (라이브락)
라이브락은 교착 상태와 유사한 또 다른 형태의 활동성 실패(liveness failure)입니다4. 교착 상태에서는 스레드들이 **차단(blocked)**된 상태로 멈춰 있지만, 라이브락에서는 스레드들이 멈추지 않고 계속해서 상태를 바꾸려 시도하지만 아무런 유의미한 진전도 이루지 못하는 상태입니다5.
책의 예시에서 pthread_mutex_trylock()
함수를 사용하면 라이브락이 발생할 수 있습니다. 각 스레드가 락 획득에 실패할 때마다 자신이 가진 락을 해제하고 다시 시도하는 과정을 무한히 반복하기 때문입니다6.
라이브락은 일반적으로 스레드들이 실패한 작업을
임의의 시간(random times) 후에 다시 시도하도록 하여 회피할 수 있습니다7.
Last updated