Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flutter Thread Merge - Flutter Tokyo #11

Flutter Thread Merge - Flutter Tokyo #11

Flutter Thread Merge - Flutter Tokyo #11
Jaichangpark, 박제창

Avatar for JaiChangPark

JaiChangPark

November 26, 2025
Tweet

More Decks by JaiChangPark

Other Decks in Technology

Transcript

  1. Advances and Challenges in Foundation Agents: From Brain-Inspired Intelligence to

    Evolutionary, Collaborative, and Safe Systems https://arxiv.org/pdf/2504.01990
  2. 動作方式 • Thread A と Thread B が、同じ変数 count に同時にアクセスして更新できる。

    メリット • データ共有が非常に速い。(ただ読むだけで良い) • メモリ効率が良い。 デメリット • 同時実行問題(Race Condition) ◦ 複数のスレッドが同時に同じ変数を更新すると値が壊れる。 • ロックが必要 ◦ それを防ぐために「今使っているから待て(Lock)」という制御が必要になる。ロックが複雑になる とデッドロックが発生し、アプリ全体が停止する危険がある Thread A と Thread B が、同じ変数 count に同時にアクセスして更新できる。 メモリ(Heap)を共有する。
  3. Dart(Flutter) が採用している独特の並行処理モデルであり、名前の通り 完全に隔離(Isolate) されている。 核心特徴 • メモリを一切共有しない。 動作方式 • Isolate

    A と Isolate B は、完全に独立した別人である。 • それぞれが独自のメモリ空間(Heap)を持つ。 • A から B にデータを渡す場合、メッセージ(Message Passing) を使う。 • このときデータは コピー(Copy) されて送られる。 アイソレート Isolates
  4. メリット • 安全性が高い: メモリ共有がないため、Lock を使う必要がなく、レースコンディションがほ ぼ発生しない。 • GC(ガベージコレクション)の効率が良い • A

    が忙しくて GC が走っても、B は停止せずに処理を続けられる。→ UI のカクつきを防ぎ やすい。 デメリット • データ転送コスト ◦ データをコピーして送るため、1GB の画像など巨大なデータのやり取りは遅くなる。 アイソレート Isolates
  5. 区分 Thread(一般的) Isolate(Dart / Flutter) メモリ 共有する(Shared Memory) 共有しない(No Shared

    Memory) 通信方 法 変数に直接アクセス メッセージ通信(Port を利用) 同期 開発者が Lock を管理する(難しい) 不要(自動的に安全) 比喩 同じオフィスで机を共有して働く社員 別々の部屋にいて、電話でやり取りする社 員
  6. • プラットフォームスレッド (Platform thread) • UIスレッド (UI thread) • ラスタースレッド

    (Raster thread) • I/Oスレッド (I/O thread) Flutter uses several threads
  7. • Dart コードと Flutter フレームワークが実行されるスレッド。 • レイヤーツリーを生成し、Raster Thread に送る。 •

    ブロックしないこと。 • Performance Overlay の 下段に表示。 UIスレッド UI thread
  8. • レイヤーツリーを受け取り、GPU と連携して描画する。 • Skia / Impeller がここで動作。 • 遅い場合は多くが

    Dart 側の処理の影響。 • Performance Overlay の 上段に表示。 ラスタースレッド Raster thread
  9. 問題 • 従来は、非常に簡単なプラットフォーム情報(例:バッテリー残量の取得、ファイ ル存在確認)であっても、 • UI スレッド ↔ Platform スレッド

    の通信が必要であった。 0.001ms で終わる処理でも、スレッドをまたぐ必要があり、強制的に async/await を使わざるを得なかった。
  10. 軽量タスク • Main Thread でそのまま実行する。 • 例:バッテリー確認、キャッシュ参照、簡単な計算、短時間で終わる FFI 呼び出 し。

    重量タスク(> 1ms) • 必ず Isolate に送る。 • 例:ファイル I/O、画像処理、ネットワーク要求、データベース検索。