Skip to content

共有された可変状態とは

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)
}

共有された可変状態。queueAがCounterのvalueへ書き込み、queueBが同じvalueを読み取る。

共有された可変状態があるだけで、必ず問題が起きるわけではありません。しかし、適切に実装されていないと、データ競合や競合状態を引き起こします。