2

私はスレッドが何であるかをオンラインで見ていますが、私はそれを理解しているようには感じません。誰かがこれに光を当てることができますか?C ++に関連するプログラミング言語に関しては、Objective-Cがいいでしょう。

Objective-cで、私は遭遇しました

@property(nonatomic, strong) NSString *name;

非アトミックの説明は、複数のスレッドが同時にオブジェクトにアクセスしようとすることを心配しないことを意味し、objective-cはスレッドセーフなコードを合成する必要がないということでした。それで、それは正確にはどういう意味でもあります。

4

2 に答える 2

6

プロセスは複数の実行スレッドで構成される場合があり、論理的には互いに同時に実行されていると考えることができます。各スレッドは独立して実行されますが、同じメモリとプロセス状態を共有します。単一のスレッドは、計算の実行、ネットワークとの対話、UI の更新、ビデオのデコードなどの「1 つのこと」を行うことができます。ただし、プログラマーによる大量の追加作業なしでは、単一のスレッドでこれらすべてを一度に実行することはできませ。 . プロセスに複数のスレッドがあると、プログラマーは、アプリケーションが一度に複数のことを簡単に実行できるようになります (マルチタスク)。

ただし、複数のスレッドを使用すると、いくつかの新しい課題が生じます。たとえば、同じ変数にアクセスする 2 つのスレッドがある場合、一方のスレッドが変数に完全に更新されずに他方のスレッドが変数にアクセスし、プログラムで障害が発生するという同時実行の危険が生じる可能性があります。Objective-C は、この状況を回避するために、デフォルトでスレッドセーフ コードを生成します。nonatomic複数のスレッドから同時にアクセスすることは決してないことをコンパイラーに伝えます。これにより、コンパイラーはスレッドセーフなコードをスキップして、より高速なコードを作成できます。これは、とにかく独自の同期を提供する場合に役立ちます (たとえば、Objective-C 自体では支援できないプロパティのグループの同期を維持する場合など)。

nonatomicコアの仮定に違反してnonatomic、同時に複数のスレッドから変数にアクセスすると、すべてが崩壊します。

于 2013-02-14T03:22:07.290 に答える
4

非アトミックの説明は、複数のスレッドが同時にオブジェクトにアクセスしようとすることを心配しないことを意味し、objective-c はスレッドセーフなコードを合成する必要がないということでした。では、それは正確にはどういう意味ですか。

紙に自分の名前を書くように言われたとします。誰かが問題なく動作すると考えた命令のリストが表示されます。

  • 現在空の行を見つけ、
  • その上でペンを動かし、
  • お名前を書いてください。

すべて良い。

ここで、新しい紙が渡され、あなたと他の誰かが同じ紙に自分の名前を書くように求められ、古い指示が与えられたとします。たとえば、次のようになります。

1) 2 人とも紙を見て、最初の行に書くことにしました。2) ペンを下に置きます (左利きと右利きの両方で十分快適にできるかもしれません)。3) あなたは I を書き始めましたが、他の人は J を書いていて、U のように見えます。 4) ここから悪化します....

しかし、同じように、あなたはより注意を払い、空行を探し始める前に自分の名前を書き終えているかもしれません。またはその逆も同様です。

スレッド化はこれによく似ています...上記の例では、各スレッド/人は、タスクの進行状況を追跡し、文字通り指示に従います。ステップ 1 のみを完了した場合、他の人がステップ 1 を実行することに注意してください。残りのステップの順序や並行性に関係なく、お互いの名前を上書きするように設定されていることに注意してください。

このすべてにおいて、同じ瞬間に物事を行う必要はありません。タスクの追跡が独立しているということだけです。あなたは、タスクのどこにいるかについて独自の記憶を持つ独立した人々です。スレッドと同じ - スレッドは個別に何をすべきかを追跡する方法であり、実際にプログラム内で同じ瞬間に何かを実行するかどうかはオプションです (これはマルチコア CPU とマルチ CPU システムで可能です)。

「原子」は、分割できないという意味で使用されます (考えてください: 金の原子を半分に切ってもまだ金を持っていることはできません)。同様に、自分の名前をアトミックに書くと言った場合、それは、観察者は、名前が完全に書かれた直前の瞬間、または名前が完全に書かれた直後の瞬間のいずれかを目撃することが保証されていることを意味します。名前。文字列変数のアトミック更新はそのようなものです。

アトミック文字列の更新では、上記の問題は解決されません...「空の行」を見つける際にまだ衝突する可能性があります (コンピューティングのコンテキストでは、コンテナー内の次の空の位置を見つけると言います)。空の行を見つけるプロセスがアトミックであり、自分で何かを書く前であってもその行が何らかの形で「使用済み」とマークされている場合、他の誰かと同じ行を取得することは決してないということです。その段階では、名前を書いている複数の人が同じ行で衝突することはありませんが、行の検出と名前の書き込みの両方が原子的である場合にのみ、紙を見ている人は、完全に書かれた衝突しない名前を見ていることを知ることができます.

この種の保証を行うことは非常に便利ですが、費用がかかります。これは、スレッドが相互に通信し、調整する必要があることを意味し、「誰」が最初に実行され、他のスレッドは必要に応じて待機することに同意する必要があります。

于 2013-02-14T03:59:59.830 に答える