Skip to content

2‐2 thread Coordination

dami0806 edited this page Jan 26, 2025 · 1 revision

스레드 조정하기 - Thread.join()

일반적인 스레드 실행

보통 여러 스레드가 병렬로 작업을 수행할 때, 스레드 간의 실행 순서는 보장되지 않습니다.(비동기성의 독립성)

image

스레드 간 의존 관계

만약 한 스레드가 다른 스레드의 결과값을 기반으로 작업을 진행해야 하는 의존성이 존재한다면 어떻게 될까요?

image

문제

  • 결과값을 계속 확인하는 방식(busy-waiting)은 CPU 낭비 및 성능 저하를 초래합니다.

해결 방법: Thread.join()

  • 스레드가 완료될 때까지 Main 스레드가 기다리도록 설정합니다.
  • 완료 후 Main 스레드는 작업을 이어서 실행합니다.
image

문제점

  • 만약 A 스레드가 너무 오래 걸리면, B 스레드는 무한정 기다릴 수밖에 없습니다.

개선된 방법: Thread.join(시간)

  • 최대 기다리는 시간을 설정하여 무한 대기를 방지합니다.
image

동작

  • 2초로 제한된 경우:
    1. A 스레드가 2초 안에 작업을 완료하면:
      • B 스레드는 기다림을 끝내고 A의 결과를 바로 사용합니다.
    2. A 스레드가 2초 안에 작업을 완료하지 못하면:
      • B 스레드는 기다림을 중단하고 다음 작업으로 넘어갑니다.

시나리오

여러 스레드들이 계산을 하고 이 결과를 Main스레드에서 한꺼번에 출력합니다.

image

문제 상황

  • Main 스레드와 여러 작업 스레드(FactorialThread)가 동시에 실행을 시작합니다.
  • Main 스레드는 작업 스레드의 완료 상태를 기다리지 않고 자신의 작업(결과 출력)을 진행합니다.
  • 이로 인해 Main 스레드가 작업 스레드의 완료 여부를 알지 못한 상태에서 결과를 출력하며, race condition (경쟁 조건) 이 발생할 가능성이 있었습니다.

2. 경쟁 조건 (Race Condition)

경쟁 조건이란?

  • 두 개 이상의 스레드가 동일한 자원(여기서는 작업 스레드의 결과)에 접근하거나, 동시에 작업을 수행할 때, 실행 순서에 따라 결과가 달라지는 상황을 의미합니다.

왜 발생할까?

Main 스레드와 작업 스레드의 비동기 실행으로 인해 Main 스레드가 작업 스레드의 완료 여부를 확인하지 않고 결과를 확인하려는 시도 때문이였습니다.


그래서 이 문제를 해결하기 위해서 Main 스레드가 작업 스레드의 완료 상태를 기다리도록 만들거나, 기다리는 시간을 제한하는 방법을 도입해야 했습니다.

  • 작업 스레드의 완료 상태를 기다림
image
  • 기다리는 시간 제한
image

그런데 Main스레드가 2초후 실행하고 종료가 되었는데
아직 끝나지 못한 스레드가 존재해서 애플리케이션이 종료되지 않는 상황이 발생했습니다.
-> thread들에 Deamon Thread로 세팅해서 해결했습니다.

image