-1

無制限のメモリを指定して、ロックを使用せずにスレッド間の同時実行を実現する方法を尋ねられました。調べてみましたが、ロックを使わない答えが見つかりません。これは可能であるはずです...

4

3 に答える 3

1

最新のCPUのほとんどは、ロックなしでデータへのアクセスを調整するために使用できる一連のアトミック操作をサポートしています(これらのCPU命令は、ロックライブラリ関数を実装するためによく使用されます)。たとえば、Sun Ultrasparcsにはコンペアアンドスワップ(CAS)命令があります。これを使用するには、最初にメモリアドレスを通常どおりCPUレジスタに読み込み、次に目的の新しい値を計算してから、CASを使用します。元の値と新しい値を指定します。メモリの内容がまだ元の値である場合にのみ、新しい値がそのメモリに書き込まれます。したがって、これは競合状態によって更新の失敗が発生するのを防ぐことはできませんが、その失敗を検出して、それに対して何をすべきかを判断することができます。通常、

それは少し混乱するかもしれないので、より具体的な例を見てみましょう。すべてのスレッドによって完了した操作の数をカウントする必要があるとします。スレッドが開始する前にカウンターを0に設定し、各スレッドにdo { read/add-1/CAS } while (failure)ロジックを使用してカウンターをインクリメントさせることができます。

于 2013-02-07T02:59:44.867 に答える
0

スレッドが次のいずれかであれば、それは完全に可能であり、非常に簡単です。

  • データを共有しない、または
  • データを共有しますが、共有されたデータからのみ読み取り、書き込みは行いません。

ただし、共有データへの書き込みが問題になると、事態は複雑になります。これはあなたが読み始める必要があるところです。

于 2013-02-07T03:06:50.787 に答える
0

ソフトウェアトランザクショナルメモリ(STM)を見ることができます。ロックする代わりに、スレッドは、競合をチェックできるトランザクションを介して共有メモリを更新できます。

于 2013-02-07T03:11:41.220 に答える