問題タブ [test-and-set]
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.
synchronization - 特別なハードウェア命令を使わずに、1 つのコードでどのように動作をテストして設定するのでしょうか?
私が見つけたほとんどの実装では、これを行うためにハードウェア命令が必要です。ただし、これが必要であることを強く疑っています(そうである場合、理由がわかりません...)
synchronization - テストアンドセットは何に使用されますか?
テストアンドセットのウィキペディアのエントリを読んだ後も、「テストアンドセットは何に使用されるのか」という質問が残ります。
(ウィキペディアで説明されているように)Mutexを実装するためにそれを使用できることを理解していますが、他にどのような用途がありますか?
language-agnostic - アトミック命令
アトミック命令とはどういう意味ですか?
以下はどのようにして Atomic になりますか?
TestAndSet
ソフトウェアの観点から、ノンブロッキング同期プリミティブを使用したくない場合、どうすれば命令の原子性を確保できますか? ハードウェアでのみ可能ですか、それともアセンブリ レベルのディレクティブの最適化を使用できますか?
.net - .NET メモリ モデル、揮発性変数、およびテスト アンド セット: 何が保証されていますか?
.NET メモリ モデル (.NET Framework 上。compact/micro/silverlight/mono/xna/what-have-you ではない) では、特定の型 (特にプリミティブ整数と参照) の操作が保証されていることを知っています。アトミック。
さらに、x86/x64 の test-and-set 命令 (およびInterlocked.CompareExchange
) は実際にはグローバル メモリの場所を参照しているため、成功すると別の命令Interlocked.CompareExchange
が新しい値を参照することになると思います。
最後に、volatile
キーワードは、読み取りと書き込みをできるだけ早く伝達し、この変数に関する操作の順序を変更しないようにするためのコンパイラへの指示であると思います (右?)。
これにより、いくつかの疑問が生じます。
- 上記の私の信念は正しいですか?
Interlocked.Read
int のオーバーロードはなく、long (2 つの WORD であるため、通常はアトミックに読み取られません) のみです。.NET メモリ モデルでは、整数/参照を読み取るときに最新の値が表示されることが保証されていると常に想定していましたが、プロセッサ キャッシュやレジスタなどを使用すると、これが不可能になる可能性があることがわかり始めています。変数を強制的に再フェッチする方法はありますか?- volatile は、整数と参照に関する上記の問題を解決するのに十分ですか?
- x86/x64では、それを想定できます...
2 つのグローバル整数変数 x と y があり、どちらも 0 に初期化されている場合、次のように記述します。
その NO スレッドは、x = 0 および y = 2 を認識します (つまり、書き込みは順番に発生します)。それらが揮発性である場合、これは変わりますか?
synchronization - クリティカル セクションの問題を解決するために TestAndSet() を使用する方法は?
私は試験のために勉強していますが、コンセプトに問題があります。これは私が与えられた疑似コードです:
このコードでは、必要な 3 つの条件 (相互排除、進行、制限付き待機) のうち 2 つだけが満たされているとインストラクターは言っていますが、どれが満たされていないのかわかりません...??
クリティカル領域の問題を解決するために欠落状態をサポートするには、コードをどのように変更する必要がありますか? 洞察を事前にありがとう!
gcc - gcc のアトミックなテストと組み込みのセットは、アトミックなフェッチとストア操作と同じですか?
MCS ロックの説明で、アトミックな「フェッチおよびストア」命令に出くわしました。
私が収集したものから、これはアトミックに値をメモリ位置に書き込み、そのメモリ位置の元の値を返しますが、それは正しいですか?
そして、gcc のアトミック ビルトインです。
アトミックなフェッチとストアと同じですか?
c++ - ロックフリー原子状態クラス - 正しいですか?
構造体にアトミックな読み取り/書き込みを実装しようとする試みについて、フィードバック (明らかな欠陥/改善方法) を探しています。
1 つの書き込みスレッドと複数の読み取りスレッドがあります。目的は、書き手の妨げにならないようにしながら、読み手が構造について一貫性のない見方をするのを防ぐことです。
この場合、Qt フレームワークによって提供されるフェッチ アンド アド アトミック プリミティブを使用しています。
例えば:
OneWriterAtomicState の実装:
これがバージョン 2 です (memcpy、reader yield、できれば getState() を修正):
c - リストに対するアトミック操作
リストがあり、test_and_set
そのパラメーターがポインター address の計算である操作を使用したいとしますl->a.next->next
。test_and_set
これはアトミックではなく、役に立たないと思います。TAS がアトミックに動作するように、そのポインター値をアトミックに計算する方法はありますか?
multithreading - TSL が複数のスレッドに対してセキュアなアトミック操作を提供できない理由
アトミック オペレーティング システムのシステム コール TSL を使用しても、2 つ以上の同時スレッドまたはプロセスに対してスレッド セーフなソリューションが提供されないのはなぜですか?
編集: 間違いをお詫びします。テストと設定ではなく、TSL を意味していました。wiki 記事への参照 - http://en.wikipedia.org/wiki/Test-and-set 具体的には:
test-and-set 操作は、2 つ以下の同時プロセスの待機なしコンセンサス問題を解決できます。
c++ - C++ でのアトミック TestAndSet によるロックレスおよびロックフル スレッド同期の混在
ロックせずにバッファから読み取る必要があるコンシューマ スレッドがあります。プロデューサ スレッドがバッファに書き込みを行っているために操作をスキップする必要がある場合は問題ありません。したがって、最も適切な選択は、いくつかのフラグのアトミックな TestAndSetであるように思えます。
ここで、前述のプロデューサー スレッドもこのフラグを尊重する必要があります。これは、コンシューマーがバッファーから読み取りを行っている間はバッファーへの書き込みを開始できないためです。次のコードのように、atomic_flag::test_and_set を使用してこれを解決できます。
...しかし、独自のスピン ロックを作成するのは理想的とは言えません。フラグがクリアされた結果としてスレッドが起動されるまで、スレッドをスリープさせたいと思います。何かのようなもの:
TLDR:一方がロックでき、もう一方がロックできない 2 つのスレッドを同期するにはどうすればよいですか?