-
Notifications
You must be signed in to change notification settings - Fork 0
2‐2 thread Coordination
dami0806 edited this page Jan 26, 2025
·
1 revision
보통 여러 스레드가 병렬로 작업을 수행할 때, 스레드 간의 실행 순서는 보장되지 않습니다.(비동기성의 독립성)
만약 한 스레드가 다른 스레드의 결과값을 기반으로 작업을 진행해야 하는 의존성이 존재한다면 어떻게 될까요?
- 결과값을 계속 확인하는 방식(busy-waiting)은 CPU 낭비 및 성능 저하를 초래합니다.
- 스레드가 완료될 때까지 Main 스레드가 기다리도록 설정합니다.
- 완료 후 Main 스레드는 작업을 이어서 실행합니다.
- 만약 A 스레드가 너무 오래 걸리면, B 스레드는 무한정 기다릴 수밖에 없습니다.
- 최대 기다리는 시간을 설정하여 무한 대기를 방지합니다.
-
2초로 제한된 경우:
-
A 스레드가 2초 안에 작업을 완료하면:
- B 스레드는 기다림을 끝내고 A의 결과를 바로 사용합니다.
-
A 스레드가 2초 안에 작업을 완료하지 못하면:
- B 스레드는 기다림을 중단하고 다음 작업으로 넘어갑니다.
-
A 스레드가 2초 안에 작업을 완료하면:
여러 스레드들이 계산을 하고 이 결과를 Main스레드에서 한꺼번에 출력합니다.
- Main 스레드와 여러 작업 스레드(FactorialThread)가 동시에 실행을 시작합니다.
- Main 스레드는 작업 스레드의 완료 상태를 기다리지 않고 자신의 작업(결과 출력)을 진행합니다.
- 이로 인해 Main 스레드가 작업 스레드의 완료 여부를 알지 못한 상태에서 결과를 출력하며, race condition (경쟁 조건) 이 발생할 가능성이 있었습니다.
- 두 개 이상의 스레드가 동일한 자원(여기서는 작업 스레드의 결과)에 접근하거나, 동시에 작업을 수행할 때, 실행 순서에 따라 결과가 달라지는 상황을 의미합니다.
Main 스레드와 작업 스레드의 비동기 실행으로 인해 Main 스레드가 작업 스레드의 완료 여부를 확인하지 않고 결과를 확인하려는 시도 때문이였습니다.
그래서 이 문제를 해결하기 위해서 Main 스레드가 작업 스레드의 완료 상태를 기다리도록 만들거나, 기다리는 시간을 제한하는 방법을 도입해야 했습니다.
- 작업 스레드의 완료 상태를 기다림
- 기다리는 시간 제한
그런데 Main스레드가 2초후 실행하고 종료가 되었는데
아직 끝나지 못한 스레드가 존재해서 애플리케이션이 종료되지 않는 상황이 발생했습니다.
-> thread들에 Deamon Thread로 세팅해서 해결했습니다.
-
운영 체제의 기본 내용 및 멀티스레딩과 병행성이 필요한 이유
-
멀티스레딩의 기본 - Java에서 스레드를 생성하는 방법 및 스레드 간에 소통하는 방법
-
멀티스레드 병렬 실행 애플리케이션의 성능 관련 고려 사항 및 설계 패턴. 지연 시간 또는 처리량을 최적화하는 방법
-
Java에서 스레드 간에 데이터를 공유하는 방법. 발생할 수 있는 모든 함정과 어려움 및 솔루션과 모범 사례
-
반응성과 성능을 향상시킬 수 있는 락이 걸리지 않은 고급 알고리즘 및 데이터 구조