共有された可変状態とは
Swift Concurrencyの思想を理解するうえで欠かせない、共有された可変状態とは何でしょうか。
- 状態とは、プログラムが使用するデータです。
- 共有とは、同じ状態を複数のTask、スレッド、キューなどが使うことです。
- 可変とは、その状態を実行中に書き換えられることを意味します。
次のサンプルコードのCounterでは、現在の数を表すvalueが可変状態です。一つのCounterインスタンスが、二つのキューから使われています。そして、一方のキューではデータが書き換えられています。
よって、以下の例ではCounter.valueは共有された可変状態と言えます。
import Dispatch
final class Counter { var value = 0}
let counter = Counter()let queueA = DispatchQueue(label: "queue-a")let queueB = DispatchQueue(label: "queue-b")
queueA.async { counter.value = 1}
queueB.async { print(counter.value)}
共有された可変状態があるだけで、必ず問題が起きるわけではありません。しかし、適切に実装されていないと、データ競合や競合状態を引き起こします。