작업 중 data race를 방지하기 위해 어떻게 처리해야할지 고민 중 Actor의 존재를 알게되어 학습하게 되었습니다.

Actor

<aside> ❓

data race: 두개이상의 각 스레드가 동시에 동일한 데이터에 접근 하고 해당 접근 중 하나이상이 write일 때 발생하는 충돌

</aside>

<aside> ❓

shared mutable state: 공유 및 변경이 가능한 상태, 다시 말해 var 변수와같이 여러곳에서 접근이 가능하며 변경이 가능한 것을 말한다.

</aside>

Actor내 선언된 함수를 사용하는 방법

func someFunction() async {
  let counter = Counter()
  await counter.increment() // actor의 함수인 increment 사용 시 await 사용
}

Actor의 shared mutable state 데이터 보호 방법

<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없이 접근 가능
}

Actor를 외부 모듈에서 접근할 때