1. TSan 사용법(경쟁 상황 발견하는 Tool)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4cf1f38b-bb02-4dac-b6be-7b3ed59b7a28/Untitled.png

Thread-safe한 코드의 구현과 방법

<aside> 💡 Lock으로 올바르게 구현하는 것은 어렵기도하고, DeadLock이 생길 가능성이 높다. Lock을 사용해서 구현하는 것은 Low-Level의 해결책이다.

</aside>

TSan 사용법

2. 시리얼큐와 Sync

Thread-safe한 코드를 작성하기 위해서는 sync메소드를 사용해야한다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f927da31-5cf0-4f2d-bcc4-7cd6c324efb5/Untitled.png

위와 같은 그림은 Thread-safe하지 않다. 코드에서 단순히 다음과 같이 구현되어 있다고 볼 수 있다.

private let serialQueue = DispatchQueue(label: "...")
private var _count = 0
public var count: Int {
	get {
		return _count
	}
	set {
		_count = newValue
	}
}

sync를 사용해주게 되면 아래의 그림처럼 공통 접근 변수에 대해 안전하게 접근이 가능하다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e10d27b3-e58e-4d74-86a6-7568de82184e/Untitled.png

private let serialQueue = DispatchQueue(label: "...")
private var _count = 0
public var count: Int {
	get {
		return serialQueue.sync {
			_count
		}
	}
	set {
		serialQueue.sync {
			_count = newValue
		}
	}
}