Skip to content

Swift Concurrencyの思想

まず、concurrency という言葉を確認します。日本語では「並行処理」、「並行性」と訳されます。

コンピュータの世界では、以下の用語として扱われることが多いです。

  • 並列処理:複数の処理装置(一般的にはCPUのコア)を用いて、複数の処理を同時に実行する技術。
  • 並行処理:一つの処理装置が、複数の処理を高速に切り替えながら処理を行う技術。これにより、複数の処理が同時に実行されているように見える。
  • 非同期処理:あるコンピュータがある処理の完了を待たずに次の別の処理を開始・実行する仕組み。

並列処理、並行処理、非同期処理の違い。並列処理は二つのコアでAとBを同時に実行する。並行処理は一つのコアがAとBを交互に実行する。非同期処理はAがBを呼び出し、Bの完了を待たずに別の作業を進める。

このチュートリアルでは、Concurrency = 非同期処理を指す用語として解釈します。

Swift Concurrencyが登場する前のSwift 1〜4でも、GCDやスレッドを使えば非同期処理を実装することができました。では、なぜ新たにSwift Concurrencyを導入する必要があったのでしょうか。

その理由は、Swiftの生みの親であるChris Lattnerが2017年に公開した Swift Concurrency Manifesto から読み取ることができます。この文書は、Swift Evaluationに提出された計画書であり、Swift Concurrency導入以前に抱えていた課題、解決法の提案が示されています

この計画書で指摘されている、Swift Concurrency以前に抱えていた問題が以下の二つです。

計画書の引用

“Modern Cocoa development involves a lot of asynchronous programming using closures and completion handlers, but these APIs are hard to use.”

現代のGCD(Grand Central Dispatch)を用いた開発では、クロージャや完了ハンドラを使う非同期処理が数多く登場する。これらのAPIは扱いにくい。

という指摘です。

第1部では、この課題を扱います。Swift Concurrency導入以前の実装方法を確認し、同じ処理をSwift Concurrencyで再実装します。

課題2:共有された可変状態が危険である

Section titled “課題2:共有された可変状態が危険である”

計画書の引用

“The concern is when the shared data is mutable, and therefore someone is changing it while others tasks are looking at it.”

問題になるのは、共有されたデータが変更可能であり、ある処理が変更しているあいだに、別の処理も同じデータを見ている場合です。 さらに、安全性について、当時のSwiftは競合状態やデッドロックなどの問題を防ぐ手助けをしていない。

という指摘です。

第2部では、こちらの課題を扱います。 まずデータ競合が起きる条件を確認し、コンパイラルにより、データ競合を招く実装を検出する仕組みを解説します。