問題タブ [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.
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 つのスレッドを同期するにはどうすればよいですか?
c - CMPXCHG とクリティカル セクションの実装
CMPXCHG ステートメントは次のように機能します。
CMPXCHG アトミック命令が使用可能な場合、クリティカル セクションを実装するための最も単純なアルゴリズムは何ですか?
c++ - Test-and-Set および CAS 操作のハードウェア サポートなしの Mutex 実装
次の単純なミューテックス定義を考えてみましょう:
そして、次のacquire()
func 実現 (compare と swap 操作を使用):
その場合、次のアセンブリ コードを取得します。
または使用する場合__atomic_test_and_set
:
次のアセンブリ コードを取得します。
しかし、アトミックな Test-and-Set および CAS 操作 ( x86 および他のアーキテクチャ上の同等のもの) のxchg
ハードウェア サポートがない場合はどうなるでしょうか? lock cmpxchg
この場合、コンパイラはどのソリューションを使用しますか?
PS - gcc 8.2 を使用してアセンブリ コードを生成しました__atomic_
。組み込み関数は次のとおりです。