スレッドセーフでないものは

スレッドを使ってユーザインターフェースの応答性を稼ごうとするとき、スレッドセーフでないものに対しては配慮が必要で、それに関する情報を見かけたときにここにまとめておく。(見つけるたびに記載するので網羅した一覧ではない。)

Cocoa でのガイドライン

  • Threading Programming Guide 2010-04-28
    • Thread Safety Summary

Cocoa を使う場合でのガイドラインは、

  • Immutable objects は基本的にはスレッドセーフ。逆に言えば、Mutable objects はスレッドセーフではない。詳細は “Mutable Versus Immutable” 参照。
  • スレッドセーフでないと見なされるオブジェクトは、複数スレッドから使用されるときにスレッドセーフではない。多くのオブジェクトは、一時期にあるスレッドで使用される限りは、問題ない。
  • アプリケーションのメインスレッドはイベント処理に責任を持つ。Although the Application Kit continues to work if other threads are involved in the event path, operations can occur out of sequence.
  • ビューへの描画にスレッドを使用するときは、NSView の lockFocusIfCanDraw と unlockFocus との間で行う必要がある。
  • Cocoa とともに POSIX スレッドを使用するときは、最初に Cocoa をマルチスレッドの状態におく必要がある。詳細は “Using POSIX Threads in a Cocoa Application” 参照。

Core Data

  • Core Data Programming Guide 2012-09-19
    • Concurrency with Core Data
      • Use Thread Confinement to Support Concurrency
      • Track Changes in Other Threads Using Notifications
  • ThreadedCoreData サンプル

thread confinement(スレッド拘束?)つまり、各スレッドが managed object context を完全に独立して持つことが必要。そのために、

  1. persistent store coordinator を共有し、各スレッドが managed object context を独立して持つ
  2. 各スレッドで、persistent store coordinator および managed object context を独立して持つ

ある managed object context での変更は他へは refetch や re-fault しない限りは伝達されないので、notification によって変更を反映する。(以下、省略。)

ユーザインターフェース

各ドキュメントで確認する必要があるが、以下に記述あり。

  • Core Data Programming Guide 2012-09-19
    • Concurrency with Core Data

AppKit や UIKit はスレッドセーフでない、特に、OS X Cocoa bindings や controllers はスレッドセーフでない。

カテゴリー: 未分類, 開発 Tips (33): Cocoa Bindings, 開発 Tips (34): 並列プログラミンング, 開発 Tips (43): Framework -- Core Data タグ: パーマリンク

コメントは停止中です。