問題タブ [stdatomic]
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++ を共有する 2 つのスレッド
したがって、同じ変数「カウンター」を共有する2つのスレッドがあります。両方のスレッドがその時点に到達したら、実行を継続することでスレッドを同期したいと考えています。残念ながら、スレッドがチェック変数を変更していないため、デッドロック状態になります。私が持っている方法は次のとおりです。
アイデアは、2 つのスレッドがあるため、それらがそのポイントに達すると (異なる時間に)、カウンターをインクリメントするということです。カウンターが 2 に等しくない場合、最初にそこに到達したスレッドは、他のスレッドがカウンターをインクリメントして同期されるまで待機する必要があります。ここで問題がどこにあるか知っている人はいますか?
この問題についてさらに詳しい情報を追加するために、配列に対する操作の半分を実行する 2 つのスレッドがあります。それらが完了したら、両方が計算を完了したことを確認したいと思います。それらが完了したら、プリンター スレッドに信号を送信してウェイクアップし、配列の印刷とクリアの操作を実行できます。両方のスレッドが完了する前にこれを行うと、問題が発生します。
擬似コード:
arrays - static std::atomicbar[CONSTANT_BAZ]、初期化されているか?
グローバル スコープにアトミック ポインターの配列があります。これらは nullptr に初期化されていますか、それとも手動でこれを行う必要がありますか?
multithreading - std::アトミック: Visual Studio 2013 (VC12) で場所 0xFEEEEFEEE を書き込むアクセス違反 - std::atomic を使用すると発生しません
次の最小限のコード例を x64 のデバッグ モードでコンパイルし、Visual Studio 2013 デバッガーで実行すると、
... で未処理の例外: アクセス違反書き込み場所 0xFEEEFEEE。
デバッグすると、「return 0;」でアクセス違反が発生することがわかりました。声明。
(デバッガーを使用せずにコンソールから実行すると、「Instruction at 0x... referenced memory at 0xddddddd... The memory could not be written.」というエラーが表示されます)。
c++ - 他の std::atomic が書き込まれた後に std::atomic を強制的に読み取る方法は?
Producer と Consumer の 2 つのスレッドがあります。データ交換は、std::atomics 内の 2 つのポインターによって制御されます。
スレッド プロデューサーは、準備されたデータを公開し、その後、waiting の値をチェックします。
load on が store on の後に来ることは非常に重要ですが、waiting
next
実際にstd::memory_order_seq_cst
はこれら 2 つのアクセスの順序を修正するだけでよいので、必要以上に強力な保証があります。を必要とせずに必要なメモリ順序を取得することは可能memory_order_seq_cst
ですか?
写真の残りの部分は次のとおりです。
スレッド コンシューマ チェックnext
. 空の場合はwaiting
、自身をブロックする前に Producer に通知するように設定します。
全体がプロデューサー/コンシューマー キューであり、複雑なメカニズムを必要とせずにロックの必要性を低く抑えます。next
実際には、単方向リストの現在のノード内にあります。通常、データはバーストで送信されるため、ほとんどの場合、Consumer は消費の準備が整ったノードを多数見つけます。まれなケースを除いて、両方のスレッドがロックとブロッキング/ウェイクアップをバースト間で 1 回だけ実行します。
c++ - std::atomic メモリ バリアを使用してスレッド間で非アトミック データを転送できますか?
次のコード標準は準拠していますか? x
(または、アトミックにせずに準拠させることはできますかvolatile
?)
これは以前の質問に似ていますが、C++ 標準の関連セクションへの引用をお願いします。
私の懸念は、アトミックstore()
でありload()
、非アトミック変数 (x
以下の例) が正しい解放および取得セマンティクスを持つための十分なコンパイラ バリアを提供していないことです。
私の目標は、スレッド間で通常の C++ データ構造へのポインターを転送できる、キューなどのロックフリーのプリミティブを実装することです。
c++ - 必要に応じた条件付き std::atomic_thread_fence の利点と欠点を取得しますか?
以下のコードは、atomic フラグを介して共有状態を取得する 2 つの方法を示しています。リーダー スレッドは or を呼び出しpoll1()
てpoll2()
、ライターがフラグを通知したかどうかを確認します。
投票方法 #1:
投票オプション #2:
オプション #1 は以前の質問で提示され、オプション #2 はcppreference.com のサンプル コードに似ていることに注意してください。
poll
関数が を返す場合にのみ共有状態を調べることに読者が同意すると仮定するとtrue
、2 つのpoll
関数はどちらも正しく同等でしょうか?
オプション #2 には標準名がありますか?
各オプションの利点と欠点は何ですか?
オプション #2 は、実際にはより効率的である可能性がありますか? 効率が悪い可能性はありますか?
完全な動作例を次に示します。
c++ - c++11 アトミックへのスタティック ライブラリ内の未定義の参照
プロジェクトで事前に作成したスタティック ライブラリを使用すると問題が発生します。このスタティック ライブラリは、c++11 アトミックを使用します。すべてがうまくコンパイルされ、静的ライブラリが作成されます。ただし、別のプロジェクトで使用しようとすると、リンク時に次のエラーが発生しました。
Compound.cpp.o は、ライブラリのオブジェクト ファイルの場合です。ライブラリを作成するために使用している Makefile は次のとおりです。
これについて何か考えはありますか?
c++ - データが期待値と一致しているにもかかわらず、compare_exchange_strong が失敗する
問題はcompare_exchange_strong
、基になるデータが に等しいにもかかわらず、false が返されることexpected
です。例えば:
data
128 ビット POD です。ptr.is_lock_free()
true を返します。これは、シングル スレッド方式でテストされます。cas_result
は常に偽であり、cmp_results
常に真です。
コンパイルは Intel の C++ コンパイラ、バージョン 16 update 2 で行われます。Linux では、libstdc++ バージョン 5.3.1。64 ビット バイナリ。
同じ ICC16 を使用して 32 ビット コードとして Windows でコンパイルした場合、まったく同じコードが正しく動作していました。これは、stdlib 実装の癖だと思います。
ありがとうございました