Skip to content

코루틴 고급 주제 학습: 경쟁 상태 해결, 시작 옵션, UnconfinedDispatcher 및 Continuation#30

Merged
sh1mj1 merged 6 commits intodevfrom
kotlin/coroutine/advanced
May 29, 2025
Merged

코루틴 고급 주제 학습: 경쟁 상태 해결, 시작 옵션, UnconfinedDispatcher 및 Continuation#30
sh1mj1 merged 6 commits intodevfrom
kotlin/coroutine/advanced

Conversation

@sh1mj1
Copy link
Owner

@sh1mj1 sh1mj1 commented May 28, 2025

설명

코루틴의 고급 주제인 경쟁 상태 해결 방법, 다양한 CoroutineStart 옵션, UnconfinedDispatcher의 동작 방식, 그리고 ContinuationsuspendCancellableCoroutine의 사용법에 대한 학습 테스트를 추가하고 관련 내용을 문서에 정리했습니다.

주요 변경 사항

CoroutineRaceConditionSolutionTest.kt:

@Volatile 애노테이션과 Mutex를 사용하여 메모리 가시성 및 경쟁 상태 문제를 해결하는 방법을 테스트했습니다.
공유 상태 변경을 위해 newSingleThreadContext 등으로 전용 스레드를 사용하는 방법을 테스트했습니다.
AtomicInteger와 같은 원자적(Atomic) 데이터 구조를 사용하여 경쟁 상태 문제를 해결하는 방법을 테스트했습니다.

CoroutineStartTest.kt:

CoroutineStart.DEFAULT: 코루틴 빌더 호출 시 즉시 실행을 예약하지만, 실제 실행은 지연될 수 있으며 취소 시 실행 대기 상태에서 종료됨을 확인했습니다.
CoroutineStart.ATOMIC: 실행 대기 상태에서 취소를 방지하여, 취소 요청 후에도 코루틴이 실행됨을 확인했습니다.
CoroutineStart.UNDISPATCHED: CoroutineDispatcher를 거치지 않고 호출자 스레드에서 즉시 실행되며, 일시 중단 후 재개될 때는 CoroutineDispatcher를 거침을 확인했습니다.

UnconfindedDispatcherTest.kt:

Dispatchers.Unconfined가 코루틴을 현재 스레드에서 즉시 실행함을 확인했습니다.
UnconfinedDispatcher를 사용하지 않을 경우, 자식 코루틴이 부모 코루틴의 작업 완료 후 실행될 수 있는 (또는 스케줄링 순서가 달라지는) 사례를 비교 테스트했습니다.
UnconfinedDispatcher로 실행된 코루틴이 일시 중단 후 재개 시, 자신을 재개시킨 스레드(예: DefaultExecutor)에서 동작함을 확인했습니다.
CoroutineStart.UNDISPATCHED 옵션으로 실행된 코루틴은 일시 중단 후 재개 시 자신이 원래 할당된 CoroutineDispatcher를 사용함을 UnconfinedDispatcher와 비교하여 테스트했습니다.

ContinuationTest.kt:

suspendCancellableCoroutine 빌더 함수가 CancellableContinuation 타입의 continuation 객체를 제공함을 확인했습니다.
다른 비동기 작업으로부터 결과를 수신받아야 하는 경우, suspendCancellableCoroutine의 타입 인자를 사용하여 결과 타입을 명시하고 continuation.resume()으로 결과를 전달하는 방법을 테스트했습니다.
continuation.resume() 등을 호출하여 코루틴을 명시적으로 재개해야 하며, 그렇지 않으면 코루틴(및 경우에 따라 프로세스)이 종료되지 않음을 확인했습니다.

study-coroutine.md:

'메모리 가시성 & 경쟁 상태' 섹션을 보강하여 @Volatile, Mutex, 전용 스레드, 원자적 데이터 구조 사용법을 정리했습니다.
'CoroutineStart 옵션' 섹션을 추가하여 각 옵션(DEFAULT, LAZY, ATOMIC, UNDISPATCHED)의 특징과 사용 사례를 설명했습니다.
UnconfinedDispatcher의 동작 방식과 CoroutineStart.UNDISPATCHED와의 차이점을 명확히 기술했습니다.
CPS(Continuation Passing Style)와 Continuation 객체의 역할, suspendCancellableCoroutine을 사용한 콜백 래핑 방법에 대한 설명을 추가했습니다.

sh1mj1 added 6 commits May 28, 2025 21:02
- `Volatile`과 `Mutex`를 사용하여 메모리 가시성 및 경쟁 상태 문제를 해결하는 방법을 테스트한다.
- 공유 상태 변경을 위해 전용 스레드를 사용하는 방법을 테스트한다.
- 원자성 있는 데이터 구조를 사용하여 경쟁 상태 문제를 해결하는 방법을 테스트한다.
- `CoroutineStart.DEFAULT`: 코루틴 빌더 호출 시 즉시 실행을 예약하지만, 호출한 코루틴이 계속 실행되므로 실제 실행은 지연될 수 있다. 취소 시 실행 대기 상태에서 종료된다.
- `CoroutineStart.ATOMIC`: 실행 대기 상태에서 취소를 방지하여, 취소 호출 후에도 코루틴이 실행된다.
- `CoroutineStart.UNDISPATCHED`: CoroutineDispatcher를 거치지 않고 호출자 스레드에서 즉시 실행된다. 일시 중단 후 재개될 때는 CoroutineDispatcher를 거친다.
…ISPATCHED 학습 테스트

- Unconfined 디스패처는 코루틴을 현재 스레드에서 즉시 실행한다.
- Unconfined 디스패처를 사용하지 않으면 자식 코루틴은 부모 코루틴 작업 완료 후 실행될 수 있다.
- Unconfined 디스패처로 실행된 코루틴은 일시 중단 후 재개 시 재개시킨 스레드(예: DefaultExecutor)에서 동작한다.
- CoroutineStart.UNDISPATCHED 옵션으로 실행된 코루틴은 일시 중단 후 재개 시 자신이 실행되는 CoroutineDispatcher를 사용한다.
- `suspendCancellableCoroutine`은 `CancellableContinuation` 타입의 continuation 객체를 제공한다.
- 다른 작업으로부터 결과를 수신받아야 하는 경우, `suspendCancellableCoroutine`의 타입 인자를 사용하여 결과 타입을 지정할 수 있다.
- `continuation.resume()`을 호출하여 코루틴을 재개해야 하며, 호출하지 않으면 프로세스가 종료되지 않는다.
@sh1mj1 sh1mj1 merged commit da44d86 into dev May 29, 2025
2 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant