Obj-C 2.0のプロパティのドキュメントでは、アトミックプロパティは内部的にロックを使用しますが、ロックの詳細は記録されません。これは、プロパティごとのロック、@synchronized(self)で使用される暗黙のロックとは別のオブジェクト単位のロック、または@synchronized(self)と同等のものであるかどうかは誰にも分かりますか?Obj-C 2.0で合成されたatomic @propertiesのロックの詳細をロックする
9
A
答えて
6
アトミック@propertiesで使用されるロックは実装の詳細です。適切なタイプの適切なプラットフォームでは、ロックのないアトミックな操作が可能で、アップルがそれらを利用していなかったら驚くでしょう。どのような場合でもロックへのパブリックアクセスはないので、同じロックで@synchronizeすることはできません。いくつかのアップルのエンジニアは、原子の性質がスレッドの安全性を保証するものではないことを指摘しています。原子プロパティは、その値の取得/設定がアトミックであることのみを保証します。正しいスレッドの安全性を確保するには、より高いレベルのロックまたは同期を使用する必要があります。また、合成ゲッター/セッターが使用しているロックと同じロックを使用することはほとんどありません。
9
生成されたコード(ARM用のiOS SDK GCC 4.0/4.2)を見ると、(struct {int32_t v;}
含む)
- 32ビット
assign
特性が直接アクセスされます。 - 32ビットより大きい構造体は、objc_copyStruct()でアクセスされます。
double
とint64_t
はobjc_copyStructでアクセスされますが、stmia/ldmiaで直接アクセスされるGCC 4.0は例外です(割り込みの場合はアトミックであることが保証されているかどうかはわかりません)。- retain/copyアクセサは、objc_getPropertyおよびobjc_setPropertyを呼び出します。
Cocoa with Love: Memory and thread-safe custom property methodsは、実装方法に関する詳細をruntime version objc4-371.2で示しています。明らかに正確な実装はランタイムによって異なる場合があります(たとえば、あるプラットフォームでは、別のロックを使用する代わりに、アトミックスワップ/ CASを使用してivar自体を回転させることができます)。
関連する問題
- 1. WPF UIのロックされたプロセスのロック
- 2. オブジェクトのロックを持つスレッドの詳細を取得する方法
- 3. データベースアクセスのロックとロック解除 - データベースがロックされています
- 4. ロックのパフォーマンス:ロックの長さとロックの比較多くの場合、
- 5. Javaでバイアスされたロック
- 6. 送信者ビュー生成されたロック
- 7. JFrog Artifactoryでロックされた管理者のロックを解除する方法は?
- 8. ロックのあるアプリケーションをロックするパターン
- 9. SystemEvents.SessionSwitchどのユーザーがロック/ロック解除されましたか
- 10. boost :: interprocess :: file_lockでロックされたファイルを作成する
- 11. ユーザーアカウントがロックされているとロックされたメッセージでログインページにリダイレクト
- 12. 指定されたオブジェクトのロックとセカンダリオブジェクトのロックの違いは何ですか?
- 13. NSLock - ロックされたロックをロックするときだけブロックすべきですか?
- 14. Gulp - コンパイルされたファイルをロックする
- 15. ロックされたファイルを移動する
- 16. PHPロックされたIPアドレス
- 17. Excelロックされたセル
- 18. ロックされたjavaファイルアンドロイドスタジオ
- 19. ロックとロック解除されたレベル・ディ・ゲームレベル
- 20. Adaptable UICollectionViewCell背景画像 - ロック/ロック解除されたゲームレベル
- 21. ロックの作成が
- 22. のSQLException:データベースファイルがロックされている(データベースがロックされている)
- 23. RuntimeError:トレーニング中にロック解除されたロックを解除するdoc2vec
- 24. Windows 8のロックされた画面WinRT
- 25. ロックされた画面のマンゴーリマインダー
- 26. ネストされたロックとの同期
- 27. (グローバルに)ロックされたインターフェイスの向き?
- 28. ロックされたjarのJava classLoaderジレンマ
- 29. Xcode swift - バックグラウンドモード - ロックされたAVPlayerのオーディオ
- 30. のTomcat:改造がロックされたParameterMap
はい、「man atomic」を参照してください。 –
同時に複数のプロパティを扱うときに、原子プロパティと@synchronized()の両方を使用するために余分なオーバーヘッドがあるかどうか疑問に思っていたので、私は尋ねていました。アトミックプリミティブを使用して実行できない操作の場合、2つのロックを効果的に使用するため、余分なオーバーヘッドが発生するようです。まぁ。 –
この場合、より高いレベルのロックセマンティクスを実装するためにすでに@synchronizedブロックまたは他の方法で保護されたブロックを使用している場合は、非構造を使用してプロパティに使用することができます。 –