멀티스레드 애플리케이션의 교착 상태

교착 상태의 발생

멀티스레드 애플리케이션에서는 여러 스레드가 동시에 실행되며 공유 자원(예: 뮤텍스 락)을 획득하려고 할 때 교착 상태가 발생할 수 있습니다1.

책의 예시에서는 두 개의 뮤텍스 락(

first_mutex, second_mutex)을 사용하고, 두 스레드(thread_one, thread_two)가 각각 다른 순서로 이 락을 획득하려 합니다2.

  • thread_one: first_mutexsecond_mutex 순서로 획득을 시도합니다.

  • thread_two: second_mutexfirst_mutex 순서로 획득을 시도합니다.

만약

thread_onefirst_mutex를 획득한 직후, thread_twosecond_mutex를 획득한다면 교착 상태가 발생합니다3. 각 스레드는 상대방이 가진 락을 기다리게 되어, 어떤 스레드도 더 이상 진행할 수 없게 됩니다.


livelock (라이브락)

라이브락은 교착 상태와 유사한 또 다른 형태의 활동성 실패(liveness failure)입니다4. 교착 상태에서는 스레드들이 **차단(blocked)**된 상태로 멈춰 있지만, 라이브락에서는 스레드들이 멈추지 않고 계속해서 상태를 바꾸려 시도하지만 아무런 유의미한 진전도 이루지 못하는 상태입니다5.

책의 예시에서 pthread_mutex_trylock() 함수를 사용하면 라이브락이 발생할 수 있습니다. 각 스레드가 락 획득에 실패할 때마다 자신이 가진 락을 해제하고 다시 시도하는 과정을 무한히 반복하기 때문입니다6.

라이브락은 일반적으로 스레드들이 실패한 작업을

임의의 시간(random times) 후에 다시 시도하도록 하여 회피할 수 있습니다7.

Last updated