の意味がアトミック属性と非アトミック属性の違いでatomic
説明されていることを理解しています。、しかし、私が知りたいのは:
Q. どこでもアトミック プロパティを使用すると、パフォーマンスの問題以外に副作用はありますか?
最近のiPhoneのパフォーマンスは非常に高速であるため、答えはノーのようです。では、なぜ多くの人がまだ を使用しているのnon-atomic
でしょうか。
でもatomic
、スレッドの安全性は保証されませんが、何もないよりはましですよね?
の意味がアトミック属性と非アトミック属性の違いでatomic
説明されていることを理解しています。、しかし、私が知りたいのは:
Q. どこでもアトミック プロパティを使用すると、パフォーマンスの問題以外に副作用はありますか?
最近のiPhoneのパフォーマンスは非常に高速であるため、答えはノーのようです。では、なぜ多くの人がまだ を使用しているのnon-atomic
でしょうか。
でもatomic
、スレッドの安全性は保証されませんが、何もないよりはましですよね?
アトミックでさえ、スレッドの安全性は保証されていませんが、それでも何もないよりはましですよね?
違う。いくつかの非常に複雑な並行プログラムを作成したので、正反対のことをお勧めします。atomic
使用するのが本当に理にかなっている場合に備えて予約する必要があります。これは、を使用せずに並行プログラムを作成するまで完全には理解できない可能性がありますatomic
。マルチスレッド プログラムを作成している場合、プログラミング エラー (競合状態など) を隠したくありません。並行性の問題を大声で明白にしたい。これにより、識別、再現、および修正が容易になります。
一部のスレッドセーフは、ないよりはましであるという考えには誤りがあります。プログラムはスレッドセーフであるか、そうでないかのいずれかです。アトミックを使用すると、プログラムのこれらの側面を並行性に関連する問題に対する耐性を高めることができますが、それだけではあまりメリットがありません。確かにクラッシュは減るだろうが、プログラムは依然として間違いなく正しくなく、不可解な方法で爆破するだろう. 私のアドバイス: 時間をかけて学び、正しく書くつもりがない場合並行プログラムは、シングルスレッドのままにしてください(それがちょっと耳障りに聞こえる場合:それは耳障りなことを意図したものではありません-多くの頭痛からあなたを救います)。マルチスレッドと並行性は巨大で複雑なテーマです。多くのドメインで真に正確で長寿命のプログラムを作成するには長い時間がかかります。
もちろん、atomic
場合によってはスレッド セーフを実現するために使用できますが、すべてのアクセスをアトミックにすると、スレッド セーフは保証されません。同様に、特にクラスの複雑さが増すにつれて、atomic
プロパティだけでクラスが真にスレッドセーフになることは (統計的に) 非常にまれです。1 つの ivar を持つクラスは、5 つの ivar を持つクラスよりも、アトミックのみを使用して真に安全である可能性が高くなります。atomic
プロパティは、私がめったに使用しない機能です (かなり大きなコードベースと同時実行プログラムもあります)。アトミックがクラスを本当にスレッドセーフにするものである場合、それは実質的にまれなケースです。
それらを回避する主な理由は、パフォーマンスと実行の複雑さです。非アトミック アクセス、および変数へのアクセスの頻度と単純さと比較すると、アトミックの使用は非常に速く追加されます。つまり、アトミック アクセスでは、実行するタスクに比べて実行がかなり複雑になります。
スピン ロックは、アトミック プロパティを実装する方法の 1 つです。では、スピン ロックやミューテックスなどの同期プリミティブが、すべてのget と set を暗黙的に囲み、スレッドの安全性が保証されないことを知っているとしたら、それが必要でしょうか? 私は確かにしません!実装内のすべてのプロパティ アクセスをアトミックにすると、大量の CPU 時間が消費される可能性があります。明示的な理由がある場合にのみ使用してください (dasblinkenlicht+1 も言及しています)。実装の詳細: 一部のアクセスでは、 の保証を維持するためにスピン ロックが必要ありませんatomic
。アーキテクチャや変数のサイズなど、いくつかの要因に依存します。
それで、あなたの質問に答えるために「何か副作用はありますか?」TL;DR 形式: お気づきのようにパフォーマンスが主な理由ですが、アトミックな保証の適用性とそれがどのように役立つかは、抽象化のレベルでは非常に狭く (誤解されることが多い)、実際のバグを覆い隠します。
使わないものにお金を払うべきではありません。CPU サイクルが時間の面でコストがかかるプラグイン コンピューターとは異なり、モバイル デバイスの CPU サイクルは、時間とバッテリーの使用の両方でコストがかかります。アプリケーションがシングルスレッドの場合atomic
、ロックとロック解除の操作は時間とバッテリーの無駄になるため、 を使用する理由はありません。バッテリーは時間よりも重要です。余分な操作の追加に伴う遅延はエンドユーザーには見えないかもしれませんが、消費されるサイクルにより、1 回の充電後にモバイル デバイスが動作できる時間が短縮されます。ユーザーは非常に重要だと考えています。