問題タブ [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.

0 投票する
4 に答える
5317 参照

java - AtomicReference.compareAndSet() は決定に何を使用しますか?

次のクラスがあるとします

そして、次のコードを実行します

最後の行で、メソッドはとの間の等値をwhile (!stats.compareAndSet(prev, newValue))どのように判断しますか? メソッドを実装するために必要なクラスはありますか? そうでない場合、なぜですか?javadoc には、次のように記載されていますcompareAndSetprevnewValueAccessStatisticsequals()AtomicReference.compareAndSet

現在の値 == 期待される値である場合、値を指定された更新された値にアトミックに設定します。

...しかし、このアサーションは非常に一般的なようで、AtomicReference で読んだチュートリアルでは、AtomicReference でラップされたクラスに equals() を実装することは決して提案されていません。

AccessStatisticsAtomicReference でラップされたクラスが equals() を実装する必要がある場合、私が考えているよりも複雑なオブジェクトの場合、オブジェクトを更新するメソッドを同期し、AtomicReference を使用しない方が速い場合があります。

0 投票する
1 に答える
1627 参照

unix - ファイルのr/wロックとリンク解除

次の問題があります。各セッションデータがセッションIDで名前が付けられた単純なファイルに保存されるファイルシステムベースのセッションストレージを作成したいと思います。

次のAPIが必要です:write(sid,data,timeout)、、ここread(sid,data,timeout)remove(sid) sid ==ファイル名、また、すべてのタイムアウトセッションを削除する可能性のあるある種のGCが必要です。

単一のプロセスで作業する場合は非常に単純なタスクですが、複数のプロセスで作業する場合、またはNFSを介して作業する場合でも、絶対に簡単ではありません。

私が考えた最も簡単な解決策は次のとおりです。

ファイルのリンク解除がファイル名で機能し、ファイルロックがファイル記述子で機能するという最大の問題。したがって、上記は次のシナリオでは機能しません。

誰かがそのような問題がどのように解決されるかについての考えを持っていますか?ファイルロックとファイル削除を組み合わせたり、ファイルをアトミックに操作したりできるトリックはありますか?

ノート:

  • データベースを使いたくない、
  • Unixの解決策を探しています
  • ソリューションは、fcnl、open、close、unlinkなどの標準のPOSIX呼び出しで機能する必要があります

ありがとう。

明確化の主な問題は、ファイルの操作(names --unlink)は、ファイル記述子の操作--lockingを使用してアトミックに実行する必要があることです。

  • 開いてリンクを解除します-ファイルを操作します
  • fnctl--記述子を処理します
0 投票する
2 に答える
1656 参照

linux - アトミック書き込みを検証する方法は?

私は (S[O|F|U] ネットワーク内と他の場所の両方で) 熱心に検索しましたが、これは珍しい質問だと思います。Debian Linux 2.6.28-4 を実行する Atmel AT91SAM9263-EK 開発ボード (ARM926EJ-S コア、ARMv5 命令セット) を使用しています。RS-485シリアルコントローラーと通信するためにttyドライバーを使用して(私は信じています)書いています。書き込みと読み取りがアトミックであることを確認する必要があります。ソース コードの数行 (カーネル ソースのインストール ディレクトリを基準として、この投稿の最後にリストされています) は、これを暗示しているか、暗黙のうちに述べています。

このデバイスへの書き込み/読み取りが実際にアトミック操作であることを確認する方法はありますか? または、/dev/ttyXX デバイスは FIFO と見なされ、引数はそこで終了しますか? コードがこの主張を強制していると単純に信じるだけでは十分ではないようです - 今年の 2 月のように、freebsd は小さな行のアトミックな書き込みを欠いていることが実証されました。. はい、freebsd が Linux とまったく同じではないことは承知していますが、私の言いたいことは、慎重に確認しても問題ないということです。私が考えることができるのは、データを送信し続けて順列を探すことだけです.もう少し科学的で、理想的には決定論的なものを望んでいました. 残念ながら、私は大学時代の並行プログラミングの授業について正確には何も覚えていません。平手打ちや正しい方向への突き出しに心から感謝します。返信を選択した場合は、事前に感謝します。

敬具、

ジェイス


ドライバー/char/tty_io.c:1087


アーチ/アーム/インクルード/asm/bitops.h:37


ドライバー/シリアル/serial_core.c:2376

また、man write(3) ドキュメントから:

パイプまたは FIFO への書き込みの試みには、いくつかの主要な特徴があります。

  • アトミック/非アトミック: 1 回の操作で書き込まれた量全体が他のプロセスからのデータとインターリーブされていない場合、書き込みはアトミックです。これは、単一のリーダーにデータを送信するライターが複数ある場合に便利です。アプリケーションは、書き込み要求がアトミックに実行されると予想される大きさを知る必要があります。この最大値は {PIPE_BUF} と呼ばれます。IEEE Std 1003.1-2001 のこのボリュームでは、{PIPE_BUF} バイトを超える書き込み要求がアトミックであるかどうかは述べていませんが、{PIPE_BUF} バイト以下の書き込みがアトミックである必要があります。
0 投票する
4 に答える
21637 参照

sql - Oracle SQL: フィールドを読み取ってインクリメントする方法

エンタープライズ アプリケーションのデータ インポート手順をリファクタリングしていて、より良い解決策を見つけたいスニペットに出会いました。データをインポートするときは、データ セットごとに一意のエンティティを作成する必要があり、この ID を順番に割り当てるために使用されるフィールドにカウンターがあります。フィールドを読み取って次の空き ID を取得し、その後それをインクリメントして次回に備えます。

現時点では、これは「C」で記述された元のアプリで 2 つのステップで行われます。

複数のプロセスが同じことを行う場合、明らかに競合状態が発生します。

編集:重要な相互要件:データベース/フィールド定義に触れることはできません。これにより、シーケンスが除外されます。

私たちは perl で書き直しています。私は同じことをしたいと思っていますが、より良いものです。原子的な解決策がいいでしょう。残念ながら、私の SQL スキルは限られているため、集合知に頼っています :-)

0 投票する
5 に答える
8424 参照

c# - C#は読み取り/書き込み操作のアトミック性をどのように保証しますか?

セクション5.5のC#仕様ではbool、特定の型(つまり、、、、、、、、、、、、、および参照型)の読み取りと書き込みはアトミックであることが保証されています。charbytesbyteshortushortuintintfloat

これは私の興味をそそりました。どうやってそれができる?つまり、個人的な経験では、読み取りと書き込みをアトミックに見せたい場合は、変数をロックするか、バリアを使用することしかできませんでした。読み取り/書き込みごとに実行する必要がある場合は、パフォーマンスが低下します。それでも、C#は同様の効果で何かをします。

おそらく他の言語(Javaなど)がそれを行います。真剣にわかりません。私の質問は、実際には言語固有のものではありません。C#がそれを実行していることを知っているだけです。

特定のプロセッサ命令を処理する必要があり、C /C++では使用できない可能性があることを理解しています。しかし、それでもどのように機能するのか知りたいです。

[編集]実を言うと、CPUがメモリ位置にアクセスしているときに、別のCPUがメモリ位置にアクセスするなど、特定の条件では読み取りと書き込みが非アトミックになる可能性があると私は信じていました。これは、CPUがすべてのオブジェクトを一度に処理できない場合にのみ発生しますか?たとえば、オブジェクトが大きすぎるため、またはメモリが適切な境界に配置されていないためですか?

0 投票する
6 に答える
4856 参照

c++ - メンバーが 4 バイト アラインされていることを確認する方法は?

OSAtomicDecrement (Mac 固有のアトミック操作) を使用するには、4 バイト アラインされた SInt32 を提供する必要があります。

この種の料理はうまくいきますか?アライメントの問題に対処する別の方法はありますか?

0 投票する
4 に答える
7645 参照

c++ - MacOSXでのアトミックインクリメント

Mac OS Xでアトミックインクリメントおよびデクリメント演算子をグーグルで検索し、「OSAtomic.h」を見つけましたが、これはカーネル空間でのみ使用できるようです。

Jeremy Friesnerは、OS Xでアセンブリまたはミューテックスを使用するクロスプラットフォームのアトミックカウンターを指摘しました(ifdefのインターリーブを理解している限り)。

OS XのようなものはありませんInterlockedDecrementか?atomic_dec()

0 投票する
3 に答える
203 参照

validation - 行が存在しないことを確認し、それをアトミックに挿入する一般的な方法は?

私はウェブアプリケーションを持っています。その中でフォームを処理するフローは次のようになります。

  1. 検証
  2. エラーの一覧表示またはデータの挿入/更新

この特定のシナリオでは、ユーザー登録プロセスを開発していますが、データベース テーブル内の一意の値の可用性を確認することに基づいて、すべての種類のフォームに共通のソリューションを見つけようとしています。

このユーザー登録では、ユーザーのログインは一意である必要があります。検証フェーズでは、アプリケーションはデータベース テーブルでの可用性をチェックし、使用可能な場合は行を挿入します。パスワードやパスワードの確認など、他のフィールドも検証する必要があります。すべての検証は、1 つの HTTP 要求で 1 回行われます。

問題は、アプリケーションがその可用性をチェックした、最初のユーザーのプロセスがそれを挿入する前に、並列プロセスで別のユーザーによって取得されていないことを確認できないことです。2 人のユーザーが同じミリ秒で同じログインを入力する可能性が非常に低いことは理解していますが、いつか、数千のユーザーが同時に何らかのフォームにデータを入力する別のフォームでこれが起こる可能性があります。

検証にすでに合格している場合、ログインがすでに登録されていることを示すエラー メッセージがユーザーに表示されることはありません。

私が解決しようとしているのは、その可用性を確認した後、1 つのHTTP 要求に挿入する前に、一意の値が使用可能であることを確認することです。最初のユーザーが自分のパスワードとパスワードの確認をいじっていたときに、別のユーザーが同じ一意のログインを登録しても問題ありません。

この問題は、既存の行を使用して簡単に解決できます。SELECT で UPDATE を実行でき、トランザクション中にロックされるからです。しかし、存在しない行で同じことを行うことはできません。それが問題だ。これを解決するにはどうすればよいですか?


ここに私が知っているいくつかの解決策があります。それらのどれが最高かはわかりません。さらに、最善の方法が私に知られているかどうかはわかりませんので、あなたが知っている方法を共有してください.

テーブルのロック

過去にこの問題をテーブルロックで解決していましたが、これが最善の方法であったかどうかはわかりません。プロセスは次のようになりました。

  1. 書き込み用にテーブルをロックする
  2. 空室状況を確認する
  3. エラーを返すか、行を挿入します
  4. テーブルのロックを解除

テーブル全体をロックすることが最悪の解決策だと言う人もいます。たぶんそうかもしれませんが、それが私が自分で思いついた唯一の方法です。

ロックは 1 つの HTTP リクエストの間だけ維持され、もちろん複数のリクエストの間では維持されません。

エラーを挿入してキャッチする

この方法は、他の人から提案されました。彼らは、その列を一意のインデックス列にし、検証と一意性のチェックを 2 つのフェーズに分けることを提案しました。プロセスは次のようになります。

  1. データを検証する
  2. 検証がOKの場合、行を挿入します
  3. 行の挿入に失敗した場合、一意の値が利用できないというエラーが表示されます

もちろん、列を一意のインデックス列にしました。しかし、これは、データベースの機能を使用して検証時にエラーをスローするという意味ではありません。アプリケーションレベルで行う必要があります。

値の可用性をチェックして挿入するプロセスに例外は何もないため、このシナリオでは例外を試行してキャッチする方法が好きではないため、この方法は好きではありません。私はそれがチェック・アンド・リザーブ・アンド・インサートの方法であるべきだと信じています。ユーザー入力の検証は、例外に基づくべきではないと私は信じています。

間違っているかもしれませんが、これが私の現在の見解です。私が明らかに間違っていると思うなら、その理由を教えてください。

0 投票する
6 に答える
752 参照

multithreading - 将来の CPU 世代はキャッシュ コヒーレントではないと思いますか?

私はプログラムを設計していますが、暗黙的なキャッシュの一貫性を仮定すると、設計がはるかに簡単になることがわかりました。たとえば、単一のライター (常に同じスレッド) 複数のリーダー (常に他のスレッド) のシナリオでは、ミューテックスを使用していません。

現在の Intel CPU では問題ありません。しかし、私はこのプログラムが少なくとも今後 10 年間 (ソフトウェアにとっては短い期間) 収入を生み出すことを望んでいるので、これが将来の CPU アーキテクチャにとって問題になる可能性があると思いますか?

0 投票する
4 に答える
32564 参照

c# - 参照の割り当てはアトミックですが、なぜInterlocked.Exchange(ref Object、Object)が必要なのですか?

私のマルチスレッドasmxWebサービスには、自分のタイプSystemDataのクラスフィールド_allDataがありました。これは、少数で構成され、List<T>としてDictionary<T>マークされていvolatileます。システムデータ(_allData)はときどき更新されます。これを行うには、という別のオブジェクトを作成し、newDataそのデータ構造に新しいデータを入力します。それが終わったら、私はただ割り当てます

割り当てはアトミックであり、古いデータへの参照を持つスレッドは引き続きそれを使用し、残りは割り当て直後に新しいシステムデータを持つため、これは機能するはずです。ただし、私の同僚は、volatileキーワードと単純な割り当てを使用する代わりにInterLocked.Exchange、参照の割り当てがアトミックであることが保証されていないプラットフォームがあるため、使用する必要があると述べました。the _allDataさらに:私がフィールドを宣言するvolatileとき

「揮発性フィールドへの参照は揮発性として扱われません」という警告が表示されます。これについてどう思いますか?