問題タブ [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.
c# - オブジェクト メンバーと原子性へのアクセス
C# の仕様から、参照の読み取り/書き込みはアトミックであることがわかっています。オブジェクトのメンバーにアクセスするステートメントでは、参照もアトミックにアクセスされますか? コンパイラがコードを生成する際に原子性を提供しなければならない一種の暗黙的な参照読み取りでもあるため、私はそう思います。
同じステートメントで、オブジェクトにアクセスしてそのメンバーにアクセスすると、オブジェクト参照が保持されるため、別のスレッドによって新しいインスタンスが作成されたときにガベージ コレクションが行われませんか?
では、チェーン内のメンバーにアクセスする場合、一番左のオブジェクト参照も保持されるので、他のスレッドによってガベージ コレクションが行われることはありませんか?
次のコードを検討してください。
MSDN ライブラリ、C# 仕様など、または Microsoft の人々から、この件名に関する公式の説明を探して、何かを壊していないこと、およびすべてが正常であることを確認しています。
assembly - 80x86 でのアトミック ビットフィールド操作?
80x86 には、単語の個々のビットをアトミックにテストして設定するための命令がありますか?
language-agnostic - アトミック命令
アトミック命令とはどういう意味ですか?
以下はどのようにして Atomic になりますか?
TestAndSet
ソフトウェアの観点から、ノンブロッキング同期プリミティブを使用したくない場合、どうすれば命令の原子性を確保できますか? ハードウェアでのみ可能ですか、それともアセンブリ レベルのディレクティブの最適化を使用できますか?
sql - 制約に違反せずに 2 つの DB 行を交換する
私はテーブルを持っていますregionkey
:
データベースの残りの部分全体は、areaid への外部キーです。このテーブルには、一意の制約を持つ (地域、ロケール) のインデックスがあります。
問題は、2 つのレコードがあることです。
そして、それらの間で (地域、ロケール) フィールドを交換する必要があるため、次のようになります。
地域とロケールの一意のインデックスに違反するため、素朴なアプローチは機能しません。
これどうやってするの?スワップを行うアトミックな方法はありますか? 提案?
java - プリミティブ型の揮発性または同期?
Java では、変数のサイズが 32 ビット以下の場合、割り当てはアトミックですが、32 ビットを超える場合はそうではありません。
二重割り当てまたは長い割り当ての場合、どの (揮発性/同期) を使用するのがより効率的ですか?
お気に入り、
synchronized はプリミティブ引数には適用できません。この場合、同期を使用するにはどうすればよいですか? もちろん、クラスをロックしたくないので、this
使用しないでください。
c - Cでは「i+=1;」です。アトミック?
Cでは、i+=1;
アトミックですか?
atomic - Berkeley DB の使用はどの程度アトミックですか?
私はハッシュ内に 24 個の項目を含む単純なアプリを作成して、プログラムの実行間で永続化するため、Berkeley DB (DBM) がこのタスクに適しているはずです。
そして、それはただの楽しみです。
しかし、それを (Ruby で) 使用すると、ユーザーが CTRL-C を押すと、実行が停止するのではないかと思います。この場合、データがすべてめちゃくちゃになることはありませんか?
たとえば、DB の値が 63 の場合、1 ずつ増やします (64 になります)。
それで、「最も重要な」1が書き込まれ、0が書き込まれていないときにCTRL-Cが発生する可能性はありますか? その場合、DB の値は 63 または 64 ではなく 127 になります。Ruby ではなく C であり、ユーザーが「ウィンドウを閉じる」または「kill」を使用してプロセスを強制終了した場合はどうなるでしょうか。考えてみると、ハード ドライブはおそらくこのバイト (または 4 バイト) をハード ディスクの表面に一度に書き込むため、これは発生しないはずです。
CTRL-C でこれが起こらない場合、停電や自分で電源プラグを蹴ると、これが起こる可能性がありますか? たとえば、値が最初に RAM にキャッシュされ、それがハードディスクに書き込まれているときに、電源プラグを蹴ると、0 が書き込まれる前にハード ドライブの電源が失われます。100 万回に 1 度、これが起こらないことはわかっていますが、これは単なる好奇心の問題です。
一方、私のスクリプトが
- コインの価値を下げる
- ユーザーのインベントリに「ハンバーガー」を与える
次に、ユーザーが CTRL-C を押すと、上記の (1) と (2) のちょうど中間で発生し、ユーザーはコインを減らし、ハンバーガーを取得しません。
これらすべてが起こらないようにするには、SleepyCat、SQLite、または MySQL を使用したトランザクション メソッドを使用することになりますが、これらのいずれも発生しませんか?
c# - C#アトミッククラスのフィールドを保護する方法は?
C# で AtomicReference クラスを作成しようとしていて、フィールド参照を保護したままにしたいのですが、get メソッドで値を返す必要もあります。
問題を回避するのは少し不器用です...フィールドを読み取り専用にすることはできません。それを設定できるようにする必要があるからです。私よりも良い解決策はありますか?
更新: 迅速な対応に感謝します! 単に _value を返すだけで参照が保護されることは当然指摘されました。また、_value が変化しないように保護したいと考えています。_value が AtomicReference の外で変化することを許可すると、このクラスを作成する目的全体が無効になります...それを達成する方法はありますか?
java - Java スレッド セーフ コード + アトミック メソッドの質問
同時に複数のスレッドからアクセスされるクラス マネージャーがあります。正しい方法でアクセスしたかどうかを知りたいですか?
また、RemoveFooをアトミックにする必要があると思いますが、よくわかりません
c# - C# でアトミックな書き込み/追加を行うにはどうすればよいですか? または、FILE_APPEND_DATA フラグを使用してファイルを開くにはどうすればよいですか?
ほとんどの Unix および Posix 準拠のオペレーティング システムでは、O_APPEND を指定して open() オペレーティング システム コールを実行すると、書き込みがアトミックな追加および書き込み操作であることを OS に示します。この動作により、ローカル ファイル システムで書き込みを行うと、ファイルの末尾に追加されることがわかります。
Windows オペレーティング システムFILE_APPEND_DATA
は、適切なパラメータを Win32 CreateFile() システム コールに渡すことで、同じ機能をサポートします。
参照:
私の問題はこれです。Net Framework ライブラリを使用して C# でこの動作を取得する方法を判断できません。Net Framework を使用してそのような動作を取得する方法はありますか? ちなみに、 FileMode.Append を使用してもそのような動作が得られるとは思いません。