問題タブ [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 - 2 つの読み取りをアトミックにする方法はありますか?
メモリ内の 2 つの値のアトミック合計が必要な状況に陥っています。私が継承したコードは次のようになります。
a と b の個々の読み取りはアトミックであり、コード内のこれら 2 つのメモリ位置への書き込みもすべてロックレス アトミックです。ただし、問題は、2 つの場所の値が 2 つの読み取り間で変化する可能性があり、実際に変化することです。
では、この操作をアトミックにするにはどうすればよいでしょうか。私は CAS についてすべて知っていますが、読み取り-変更-書き込み操作をアトミックにすることだけが必要になる傾向があり、それは私がここでやりたいことではありません。
それを行う方法はありますか、またはコードをリファクタリングして、1つの値のみを確認する必要があるようにするための最良のオプションはありますか?
編集: ありがとう、最初のリビジョンでこれをロックレスでやりたいとは言いませんでしたが、2 回目のリビジョンの後でそれを理解した人もいました。こういうことを言う人は誰も信じないのはわかっていますが、実際にロックを使うことはできません。アトミックでミューテックスをエミュレートする必要があり、それはコードをリファクタリングして 2 つではなく 1 つの値を追跡するよりも手間がかかります。
今のところ、私の調査方法は、値が連続しているという事実を利用し、64 ビットの読み取りでアトミックにそれらを取得することです。これは、ターゲット プラットフォームではアトミックであることが保証されています。誰かが新しいアイデアを持っている場合は、貢献してください! ありがとう。
c++ - x86 (Pentium 以降) でアトミック 64b 読み取りを実行するには?
x86 プラットフォーム (Pentium 以上を保証) で 64b アラインされた 64b データのアトミック読み取りを実行したいと考えています。
これを行う方法はありますか?(いいえ、これにはクリティカルセクションやミューテックスを使用したくありません。これをロックフリーにしたいのです)。
c - GCC で一般的なアトミック ロードまたはストアを実装するより良い方法は?
GCC の組み込みのアトミック操作を認識しています: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html
ただし、このリストには、ロードやストアなどの非常に単純な操作は含まれていません。インラインアセンブリを使用して制限付きアーキテクチャでこれらを実装できます (実際、x86 のような多くの場合、基本的には通常の mov になります) が、一般的なケースでは次のようなものよりも良い方法はありません:
c# - 複数のネットワークにまたがるファイルのアトミックな変更
それぞれ異なるネットワーク共有にある 5 つの同一の xml ファイルを変更するアプリケーションがあります。これが不必要に冗長であることは承知していますが、「そうでなければなりません」。
このアプリケーションが実行されるたびに、正確に 1 つの要素 (それ以上でもそれ以下でもない) が追加/削除/変更されます。
最初に、アプリケーションは各 xml ファイルを開き、要素を適切なノードに追加/削除/変更してファイルを保存するか、保存できない場合はエラーをスローします (ネットワーク共有にアクセスできない、タイムアウトなど...)。
これをアトミックにするにはどうすればよいですか?
私の最初の仮定は次のとおりでした。
しかし、私はそれがこれまでのところしか進んでいないことがわかります。これを行う別の方法、または私が指し示すことができる方向はありますか?
macros - マクロを「アトミック」にする方法
IOW マクロの実行時に OOo の元に戻す/やり直しを正しく機能させるにはどうすればよいですか?
これは私の以前の質問に関連しています: #853176
c++ - ロックフリー構造の C++ アトミック操作
cmpxchg16bなどのアトミック(ダブル)比較およびスワップ命令を使用して、ロックフリーメカニズムを実装しています
私は現在、これをアセンブリで作成してからリンクしています。ただし、コンパイラにこれを自動的に実行させる方法があるかどうか疑問に思いましたか? たとえば、コード ブロックを 'atomically' で囲み、基礎となるプロセッサ アーキテクチャでコードをアトミック命令として実装する方法を理解させます (または、基礎となるアーキテクチャがサポートしていない場合はコンパイル時にエラーを生成します)。
PS gccにはいくつかの組み込み機能があることを知っています(少なくともCASの場合)
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins
thread-safety - 非整列データの連動操作
win32 の連動関数は、データに対するアトミック操作のメカニズムを提供します。それらは、スレッドセーフでマルチプロセッサセーフであると想定されています。
データが整列されていない場合はどうなりますか? 連動操作はまだアトミックですか?例: アラインされていない整数のインクリメント。
タイ
sql - トランザクション処理:ロールバックはいつ発生しますか?
最近、この質問は、トランザクションが一般的なコンテキストで何であるかの定義について投稿されました。この質問に対する一般的な答えは、トランザクションはアトミックな作業単位でなければならないというものでした。
私の質問はこの原子性に関連しています(私は思う)SQLストアドプロシージャでROLLBACKへの明示的な呼び出しをよく目にします。
ロールバックが明示的に要求されることは、一般的にトランザクション処理システムの一般的な要件ですか?
コミット時にエラーが発生した場合、ロールバックは自動的に発生しますか?
multithreading - スレッドの安全性...私の「最善の」行動方針は何ですか?
データをスレッドセーフにする「最良の」方法は何だろうと思っています。
具体的には、リンクされたリストを複数のスレッドで保護する必要があります。あるスレッドがリンクされたリストから読み取ろうとしているときに、別のスレッドがデータを追加/削除したり、リスト全体を解放したりする可能性があります。ロックについて読んでいます。これらは最も一般的に使用されるアプローチのようですが、明らかに問題 (デッドロック) になる可能性があります。また、アトミック操作とスレッドローカルストレージについても読みました。
あなたの意見では、私の最善の行動方針は何ですか? ほとんどのプログラマーが使用するアプローチは何ですか? また、その理由は何ですか?
multithreading - 1つのアセンブラ命令は常にアトミックに実行されますか?
今日私はこの質問に出くわしました:
あなたはコードを持っています
worker
2つの異なるスレッドから呼び出された場合counter
、両方が終了した後、どのような値になりますか?
私は実際にそれが何でもあり得ることを知っています。しかし、私の内部の内臓は、それcounter++
はおそらく単一のアセンブラー命令に変換され、両方のスレッドが同じコアで実行さcounter
れる場合、20になると言っています。
しかし、これらのスレッドが異なるコアまたはプロセッサで実行されている場合、マイクロコードに競合状態が発生する可能性はありますか?1つのアセンブラ命令は常にアトミック操作と見なすことができますか?