Open17

Swift ConcurrencyのSendableとIsolation Domain / Isolation Boundaryがどのように機能してデータ競合を防ぐのか

ykwsykws

学習のポイント

  • Isolation
  • Isolation boundary
  • Sendable
ykwsykws

Task のインスタンスごとに Isolation が存在する

ただし、下記のような場合は MainActor の Isolation に所属する

Task { @MainActor
ykwsykws

Data isolation is the mechanism used to protect shared mutable state. But it is often useful to talk about an independent unit of isolation. This is known as an isolation domain.

データの隔離は、共有される可変の状態を保護するためのメカニズムです。しかし、独立した隔離単位について話すことが有用な場合が多く、これを隔離ドメインと呼びます。

ykwsykws

In some cases, all values of a particular type are safe to pass across isolation boundaries because thread-safety is a property of the type itself. This is represented by the Sendable protocol.

特定の型のすべての値が、スレッドセーフであることから隔離の境界を越えて渡しても安全である場合があります。これは、型自体が持つスレッドセーフの特性に基づいており、Sendableプロトコルで表されます。

ykwsykws

Task の Isolation Domain で実行するので、 Task はそれぞれの Isolation boundary を跨ぐので、 Sendable への準拠が必要
Sendable に準拠していない値は capture できない

ykwsykws

Isolation Domain がそれぞれ存在していて、その境界が Isolation boundary でそれを超えることができるのは Sendable
越えられないものをコンパイルで検知可能になったのが Swift 6

ykwsykws

特定の Isolation Domain でしか利用されないことが静的に判断できればコンパイルを通すのが Region Based Isolation
Sendable ではなくても Isolation boundary を超えることができる

ykwsykws

Actor が内部で Queue を管理して処理してくれている

ykwsykws

実際に手を動かしてコンパイラの理解を深めるのが大事