問題タブ [atomic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - AtomicInstructionsとVariableUpdateの可視性
最も一般的なプラットフォーム(最も重要なのはx86です。一部のプラットフォームには、マルチスレッドに役立つ保証がほとんどない非常に難しいメモリモデルがあることを理解していますが、まれな反例は気にしません)、次のコードは安全ですか?
スレッド1:
スレッド2:
アトミック操作の標準的で合理的な実装を想定すると、次のようになります。
- スレッド1の割り当ては、呼び出される
someVariable
前に完了することが保証されていますか?atomicSet()
- スレッド2は、アトミックに読み取る場合、
someVariable
呼び出す前に割り当てを確認することが保証されていますか?doMoreStuff()
stuffDoneFlag
編集:
- 私が使用しているアトミック操作の実装には
LOCK
、役立つ場合は、各操作にx86命令が含まれています。 stuffDoneFlag
なんとかして適切にクリアされたと仮定します。どのように重要ではありません。- これは非常に単純化された例です。問題のコンテキスト全体を理解して答える必要がないように、この方法で作成しました。私はそれが効率的ではないことを知っています。
java - 複数のスレッドがフィールドにアクセスできる場合、それを揮発性としてマークする必要がありますか?
いくつかのスレッド(一般的な同時実行の問題、揮発性キーワード、メモリモデル)を読んでいます。Javaの同時実行の問題について混乱しています。
複数のスレッドからアクセスされるフィールドがたくさんあります。それらを調べて、すべて揮発性としてマークする必要がありますか?
クラスを構築するとき、複数のスレッドがそれにアクセスするかどうかわからないので、フィールドを揮発性にしないことは確かに安全ではありません。したがって、私の理解では、クラスを使用しないケースはほとんどありません。これは正しいです?
私にとって、これはバージョン1.5 JVM以降に固有ですが、私の特定のセットアップについての回答に限定されているとは感じません。
c++ - 大量のファイルのアトミック削除
10000以上のファイルを一度に削除しようとしています。たとえば、すべてを一度に削除するか、すべてをそのままにしておく必要があります。
もちろん、明らかな答えは、すべてのファイルを一時ディレクトリに移動し、成功したときに再帰的に削除することですが、これにより、必要なI/Oの量が2倍になります。
1)削除する必要のあるファイルがわからない、2)ファイルを頻繁に編集する必要があるため、圧縮は機能しません。
I / Oコストを削減するのに役立つものはありますか?どのプラットフォームでもかまいません。
編集:停電はいつでも発生する可能性があると仮定しましょう。
multithreading - ソフトウェア トランザクショナル メモリをどのように実装しますか?
実際の低レベルのアトミック命令とメモリ フェンス (使用されていると思います) に関して、STM をどのように実装しますか?
私にとって不可解な部分は、コードの任意のチャンクが与えられた場合、後で戻って各ステップで使用された値が有効かどうかを判断する方法が必要だということです。それをどのように行い、どのように効率的に行うのですか? これは、他の「ロック」ソリューションと同様に、(競合の可能性を減らすために) クリティカル セクションをできるだけ小さくしたいことを示唆しているようにも思えますが、そうですか?
また、STM は「計算の実行中に別のスレッドがこの領域に入ったため、計算は無効です」を単純に検出できますか、それとも破壊された値が使用されたかどうかを実際に検出できますか (したがって、運が良ければ、2 つのスレッドが同じクリティカル セクションを実行せずに同時に実行される場合があります)。ロールバックの必要性)?
multithreading - 「ベナフォア」は最新の OS に実装する価値がありますか?
BeOS プログラマーだった頃、 Benoit Schillings によるこの記事を読み、「ベナフォア」を作成する方法を説明しました: アトミック変数を使用して、共通のミューテックスを取得/解放する必要を回避するクリティカル セクションを強制する方法 (競合なし) ケース。
私はそれがかなり賢いと思いました.atomic-increment/decrementをサポートするどのプラットフォームでも同じトリックを行うことができるようです.
一方、これは標準のミューテックス実装自体に簡単に含めることができるもののように見えます...その場合、私のプログラムでこのロジックを実装することは冗長であり、何の利点もありません.
最新のロック API (pthread_mutex_lock()/pthread_mutex_unlock() など) がこのトリックを内部的に使用しているかどうかを知っている人はいますか? もしそうでなければ、なぜですか?
linux - メタデータを失うことなくLinux上でアトミックファイルを保存
私はPerlベースのファイル同期ツールに取り組んでいます。ファイルを一時ディレクトリ(実際のファイルと同じファイルシステム上にあることが保証されています)にダウンロードしてから、一時ファイルを古いファイルの上に移動し、アクセス許可、所有権、ACLなどのメタデータを保持します。Linuxでその最後のステップをどのように達成するのか疑問に思っています。
Mac OS Xでは、少なくともCでは、このexchangedata
関数を使用します。これは、引数として2つのファイル名を取り、それらの内容を交換して、すべてのメタデータ(mtimeを除く)をそのまま残します。これにより、操作がアトミックであることが保証されます。すべてのリーダーには、古いファイルまたは新しいファイルのいずれかが表示され、その間に何かが表示されることはありません。残念ながら、Linuxでは利用できないと思います。
アトミックに移動することは知っていrename
ますが、メタデータは保持されません。一方、ファイルを開いてデータを新しいコンテンツで上書きすることもできます。これにより、すべてのメタデータが保持されますが、不可分操作にはなりません。この問題に取り組むための提案はありますか?
multithreading - アトミックスワップを使用してアトミックインクリメントを実装しますか?
アトミック操作が無条件スワップのみであるCPUの(アセンブリ)コードを記述していると仮定します。LL/ SC、コンペアアンドスワップ、プレーンスワップはありません。(ARM9はそのような獣の例です。)スワップ操作を使用してアトミックインクリメント/デクリメント操作を実行する方法はありますか?
比較的簡単な答えがあります。それは、スワップを使用してスピンロックを構築し、それを使用して通常のインクリメントとデクリメントの周りのクリティカルセクションを提供することです。しかし、それは不格好に思えます。CASまたはLL / SCが利用可能な場合は、ロックなしで実行できることを私は知っています。だから私が本当に疑問に思っているのは、ロックを使わずにそれを行う方法があるかどうかです。
atomic - Solaris (sparc アーキテクチャ) でアトミック加算操作コードが必要
次と同等のアトミック操作コードが必要です。
(Linux では、2 つの変数 a と b を追加し、出力を a と c の両方に保存します)
Solaris(Sparcアーキテクチャ)では上記と同等のものが必要です。私を助けてくれる人はいますか?
language-agnostic - ロックレス キューを作成するにはどうすればよいですか?
今日は、ロックレス キューを調査してきました。複数のプロデューサー、複数のコンシューマーの状況があります。テストのために、Win32 で Interlocked SList を使用するシステムを実装したところ、スレッド化されたタスク ベースのコードのパフォーマンスが 2 倍になりました。残念ながら、複数のプラットフォームをサポートしたいと考えています。複数のプラットフォームでの連動自体は問題なく、問題なく連動できると考えて間違いありません。しかし、実際の実装は私を失います。
大きな問題は、リストのプッシュ/ポップが 1 つのインターロック呼び出しのみを使用することを保証する必要があることです。そうしないと、別のスレッドが挟み込んで物事を台無しにするためのスペースを残していることになります。Microsoft の実装が内部でどのように機能するのかよくわかりません。詳しく知りたいです。
誰でも有用な情報を教えてもらえますか (プラットフォームと言語はまったく関係ありません)。
それに加えて、ロックレスベクターを実装できるかどうか知りたいです。それは私にとって非常に多くの用途があります:)乾杯!
編集: ハーブの DDJ の記事を読んだ後、私がすでに持っていたものとかなり似た、削減されたロック キューを確認できます。しかし、ダブルコンペアアンドスワップ (DCAS) 操作を使用して真のロックレスキューイングを行うことができる論文が最後にあることに気付きました。cmpxchg8b (または cmpxchg16b) を使用してキューを実装した人はいますか?
私はこの時点で(論文を読んでいない)ただ黙想していますが、このシステムを使用してヘッドポインターとテールポインターを同時に更新し、別のスレッドが2つのアトミック操作の間にジャンプする問題を回避できます。ただし、次のヘッド ポインターを取得してテール ポインターに対してテストし、テールを変更したかどうかを確認する必要があります。他のスレッドがこの情報を変更する準備をしている間に、別のスレッドがこの情報を変更しないようにするにはどうすればよいでしょうか? これはロックレスな方法でどの程度正確に実装されていますか? それとも、研究論文である解読不能性を読んだほうがよいでしょうか? ;)