Memory Safety
昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html を読む。
- シングルスレッドでも競合は起きる
- 次のすべての条件を満たす2つのアクセスがある場合、競合が発生する
- 少なくとも1つは書き込み
- メモリ内の同じ場所にアクセスする
- 期間が重複する
- メモリアクセス期間には「瞬時」か「長期」がある
- ふつうは瞬間的。いくつかの場合「長期アクセス」がある。長期アクセスは他のアクセスとオーバーラップできる
inout
パラメータの書き込みアクセスは、他の非inout
パラメータの評価が全て終わった後、 関数呼び出しの期間続く- 競合するとランタイムエラー
- ひとつの解決方法は、値をコピーすること
- 2つの
inout
パラメータをとる関数に、同一の変数を渡すとコンパイルエラー - 構造体の
mutating
メソッド は メソッド呼び出しの期間self
への 書き込みアクセスを持つ x.mutatingMethod(&x)
→コンパイルエラー- 構造体・列挙型・タプルの値の一部を変更すると値全体が変更される場合に競合するおそれがある
- 次の条件が適用される場合、コンパイラは、構造体プロパティへの重複アクセスが安全であることを証明できる
ちょっと意図しないところで出そうで怖いけど、 コンパイルエラーでもランタイムエラーでも「modification requires exclusive access」と言われるので、 言われたらまあ気づけるかな、と思う。