非アトミックの説明は、複数のスレッドが同時にオブジェクトにアクセスしようとすることを心配しないことを意味し、objective-c はスレッドセーフなコードを合成する必要がないということでした。では、それは正確にはどういう意味ですか。
紙に自分の名前を書くように言われたとします。誰かが問題なく動作すると考えた命令のリストが表示されます。
- 現在空の行を見つけ、
- その上でペンを動かし、
- お名前を書いてください。
すべて良い。
ここで、新しい紙が渡され、あなたと他の誰かが同じ紙に自分の名前を書くように求められ、古い指示が与えられたとします。たとえば、次のようになります。
1) 2 人とも紙を見て、最初の行に書くことにしました。2) ペンを下に置きます (左利きと右利きの両方で十分快適にできるかもしれません)。3) あなたは I を書き始めましたが、他の人は J を書いていて、U のように見えます。 4) ここから悪化します....
しかし、同じように、あなたはより注意を払い、空行を探し始める前に自分の名前を書き終えているかもしれません。またはその逆も同様です。
スレッド化はこれによく似ています...上記の例では、各スレッド/人は、タスクの進行状況を追跡し、文字通り指示に従います。ステップ 1 のみを完了した場合、他の人がステップ 1 を実行することに注意してください。残りのステップの順序や並行性に関係なく、お互いの名前を上書きするように設定されていることに注意してください。
このすべてにおいて、同じ瞬間に物事を行う必要はありません。タスクの追跡が独立しているということだけです。あなたは、タスクのどこにいるかについて独自の記憶を持つ独立した人々です。スレッドと同じ - スレッドは個別に何をすべきかを追跡する方法であり、実際にプログラム内で同じ瞬間に何かを実行するかどうかはオプションです (これはマルチコア CPU とマルチ CPU システムで可能です)。
「原子」は、分割できないという意味で使用されます (考えてください: 金の原子を半分に切ってもまだ金を持っていることはできません)。同様に、自分の名前をアトミックに書くと言った場合、それは、観察者は、名前が完全に書かれた直前の瞬間、または名前が完全に書かれた直後の瞬間のいずれかを目撃することが保証されていることを意味します。名前。文字列変数のアトミック更新はそのようなものです。
アトミック文字列の更新では、上記の問題は解決されません...「空の行」を見つける際にまだ衝突する可能性があります (コンピューティングのコンテキストでは、コンテナー内の次の空の位置を見つけると言います)。空の行を見つけるプロセスがアトミックであり、自分で何かを書く前であってもその行が何らかの形で「使用済み」とマークされている場合、他の誰かと同じ行を取得することは決してないということです。その段階では、名前を書いている複数の人が同じ行で衝突することはありませんが、行の検出と名前の書き込みの両方が原子的である場合にのみ、紙を見ている人は、完全に書かれた衝突しない名前を見ていることを知ることができます.
この種の保証を行うことは非常に便利ですが、費用がかかります。これは、スレッドが相互に通信し、調整する必要があることを意味し、「誰」が最初に実行され、他のスレッドは必要に応じて待機することに同意する必要があります。