[Android] coroutine Mutex 왜써요?

윤호이·2023년 11월 2일
0

coroutine

목록 보기
2/7
post-thumbnail

서론

mutex와 semaphore
운영체제를 배울때 한번쯤은 들어보셨을 겁니다.
그중에 코루틴에서는 Mutex를 지원하는데
어떻게 사용하는 걸까요?

같은 자원을 동시에 접근할때

var counter =0
fun test() = runBlocking {
    val mutex = Mutex()
    GlobalScope.massiveRun {
        counter++
    }
    println("Counter = $counter")
}

suspend fun CoroutineScope.massiveRun(action: suspend () -> Unit) {
    val n = 100
    val k = 1000
    val time = measureTimeMillis {
        val jobs = List(n) {
            launch {
                repeat(k) { action() }
            }
        }
        jobs.forEach { it.join() }
    }
    println("Completed ${n * k} actions in $time ms")
}

이코드와 같이 많은 코루틴에서 같은 자원에 접근하여
수정한다면 어떻게 될까요?
과연 10만번 전부 수정 가능할까요?

Completed 100000 actions in 25 ms
Counter = 21647

정답은 불가능 하다입니다.
공유 자원을 동시에 접근하려니 동작이 제대로 실행이 안됐죠?

이럴 때 사용하는 것이 Mutex입니다!

사용 방법

var counter =0
fun test() = runBlocking {
    val mutex = Mutex()
    GlobalScope.massiveRun {
        mutex.withLock {
            counter++
        }
    }
    println("Counter = $counter")
}

이와 같이 Mutex를 만들어주고 수정할 자원을 withLock으로 감싸주면 됩니다.
간단하죠?
이렇게 하는 것만으로도 정상 동작해요!

Completed 100000 actions in 136 ms
Counter = 100000

왜그럴까요?

Mutex의 동작

위와 같은 상황에서는
수 많은 코루틴이 한 자원을 사용하려고 경쟁상태에 돌입하게 되는데

Mutex를 이용하게 되면
상호 배제(Mutual exclusion)를 통해 자원에 접근할땐 하나의 코루틴만
접근 가능하도록 해서 경쟁상태를 해결하게 됩니다.

하고 싶은 말

코루틴을 사용하다보면 수많은 코루틴을 동시에 실행해서
본의아니게 경쟁상태가 되는 경우가 생깁니다.
이럴때 mutex를 잘 사용하면
도움이 되겠죠?

참조

https://myungpyo.medium.com/%EC%BD%94%EB%A3%A8%ED%8B%B4-%EA%B3%B5%EC%8B%9D-%EA%B0%80%EC%9D%B4%EB%93%9C-%EC%9E%90%EC%84%B8%ED%9E%88-%EC%9D%BD%EA%B8%B0-part-8-1b434772a100

profile
열정은 내 삶의 방식, 꾸준함은 내 삶의 증명

0개의 댓글

관련 채용 정보