작업 중 data race
를 방지하기 위해 어떻게 처리해야할지 고민 중 Actor의 존재를 알게되어 학습하게 되었습니다.
Actor는 변경이 가능한 상태
를 고립시켜 보호하게된다.
즉, var 변수를 방에 가둬놓고 여러명이 접근하려고 하면 한명씩 줄세워 차례차례 접근하게 한다.
클래스(참조)와 유사하지만 actor는 한번에 하나의 작업
만 mutable state
가 변경이 가능하도록 허용
외부에서 actor를 사용 시 비동기
로 수행(await를 사용하여 두번째로 호출된 작업은 기다린 후 진행)
<aside> ❓
data race
: 두개이상의 각 스레드가 동시에 동일한 데이터에 접근
하고 해당 접근 중 하나이상이 write
일 때 발생하는 충돌
</aside>
<aside> ❓
shared mutable state
: 공유 및 변경이 가능한 상태, 다시 말해 var 변수와같이 여러곳에서 접근이 가능하며 변경이 가능한 것을 말한다.
</aside>
func someFunction() async {
let counter = Counter()
await counter.increment() // actor의 함수인 increment 사용 시 await 사용
}
actor-isolated
하기에 self
를 통해서만 접근이 가능하며 외부에서
await
키워드 없이 프로퍼티에 접근이 불가write
하려고 할 때 발생되는 사유로 let은 write가 불가하여 접근 허용)<aside> ❓
actor-isolated
: actor에서 동시에 하나만의 스레드만 접근이 가능하도록 보장하는 방식
</aside>
actor Sample {
var someVar: Int = 0
let someLet: Int = 0
}
func someFunction() {
let sample = Sample()
Task {
await sample.someVar // var의 경우 await로 접근
}
sample.someLet // let의 경우 write가 불가하므로 await없이 접근 가능
}
await
를 통해 접근이 가능