1. ホーム
  2. multithreading

[解決済み] 初心者のためのアトミック操作とは?

2022-03-06 16:42:50

質問

私はOSの初心者なのですが、Stackoverflowで見つけたどの回答も複雑で、理解することができません。どなたか、"an "とは何か、解説していただけませんか?

<ブロッククオート

アトミック操作

初心者のために?

私の理解では 私の理解では atomic operation で完全に実行されることを意味します。 中断なし ? すなわち、それは ブロッキング の操作で、中断の範囲がないのですか?

解決方法は?

アトムはギリシャ語の "atomos"(切断できない)に由来し、非常に長い間、不可分な最小単位という意味で使われてきました(物理学者が、実はアトムが存在することを発見するまで)。 原子より小さいもの)。並行プログラミングでは、途中でコンテキストスイッチがないこと、つまりアトムコマンドの実行に影響を与えるものがないことを意味します。

例:ウェブ投票、自由形式の質問、しかし何人が同じ答えをしたかを集計したい。データベースのテーブルに答えとその数を挿入します。コードは簡単です。

get the row for the given answer
if the row didn't exist:
  create the row with answer and count 1
else:
  increment count
  update the row with new count

それとも、そうなのか?複数人が同時にやるとどうなるか見てみましょう。

user A answers "ham and eggs"       user B answers "ham and eggs"
get the row: count is 1             get the row: count is 1
okay, we're updating!               okay, we're updating!
count is now 2                      count is now 2
store 2 for "ham and eggs"          store 2 for "ham and eggs"

ハムエッグは、2人が投票したのに、1人しか増えなかった。これは明らかに私たちが望んでいたことではありません。アトミックな操作として、quot;存在したらインクリメントするか、新しいレコードを作るか... 簡潔のために、これを "upsert" (for "update or insert") と呼ぶことにしましょう。

user A answers "ham and eggs"       user B answers "ham and eggs"
upsert by incrementing count        upsert by incrementing count

ここで、それぞれのupsertはアトミックです:最初のupsertはカウントを2に残し、2番目のupsertは3に残しました。

この場合、upsert操作はデータベースのanswerテーブルの操作に対してのみ原子である必要があります。upsertが行おうとしていることの結果に影響を与えない限り、コンピュータは他のことを自由に行うことができます。