問題タブ [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.
multithreading - 別のスレッドで変数を読み取る
Linux を使用しており、別のスレッドで読み取り/書き込みを行う 2 つの変数があります。ときどき (100ms) ThreadB が変数のステータスを読み取り、何かを実行します。それは基本的にwhile(1){ dosomething(); usleep(); }
です。変数がキャッシュされて更新されないのではないかと心配しています。
最適化後にループが確実に機能するようにする最善の方法は何ですか? 私はvolatile
その仕事をすべきだと考えていますが、時々うまくいかないと聞きます。どちらのループも頻繁には実行されません (10 ミリ秒以上)。それらにアクセスするための最も簡単で直接的な方法は何ですか? 私はC++ 11を使用しています
使い方がちょっとわかりませんstd::atomic<int>
。通常の int 変数のように使用できますか?期待どおりに動作しますか?
c++ - これは ``memory_order_relaxed`` の正しい使い方ですか?
C++11 で導入されたアトミック プリミティブを (控えめに) 使用し始めています。非常に単純な使用例は、アプリケーションの実行時構成を格納std::atomic<integral>
するグローバルsettings
クラスで使用する場合です。
このクラスには、プログラムの起動時に初期化されるグローバル変数にアクセスするための静的メソッドが多数あります。以前は、これらのグローバル変数へのアクセスは によって保護されていましたmutex
:
でstd::atomic
、私は今持っています:
ここで、アトミック操作のメモリ順序仕様について読んでいました: http://en.cppreference.com/w/cpp/atomic/memory_order
この非常に些細なユース ケース シナリオでは、次のload()
呼び出しを変更できます。
ここでの唯一の要件は、グローバル設定の検査および/または変更の操作がアトミックでなければならないということです。これらの操作は、ロックフリー アルゴリズムの一部ではなく、(少なくとも現在は) 順序付けする必要はありません。
私が行ったいくつかの調査から、コンセンサスは、専門家でない限りリラックスした操作を避けることであるように見えます (明らかに私はそうではありません:)。
visual-c++ - SRWLock と std::atomic_flag のパフォーマンス
条件変数と組み合わせた SRWLock と std::atomic_flag の両方が私のニーズを満たすシナリオがあります。パフォーマンスが懸念される場合、どちらかを優先する理由はありますか? 共有リソースに対してデータの読み取りと書き込みの両方を行う 2 つのスレッドがあるため、現在 SRWLock を使用して排他ロックを取得しています。
c++ - memory_order_consume と memory_order_acquire の違い
GCC-Wiki の記事について質問があります。「全体のまとめ」という見出しの下に、次のコード例が示されています。
スレッド 1:
スレッド 2:
すべての store がreleaseで、すべての load がacquireであれば、スレッド 2 の assert は失敗しないと言われています。これは明らかです (スレッド 1 の x へのストアは、スレッド 2 の x からのロードと同期するため)。
しかし、今私が理解していない部分があります。また、 store がすべてreleaseで load がすべて consumerであれば、結果は同じであるとも言われています。y からの負荷が x からの負荷の前に引き上げられる可能性はありませんか (これらの変数間に依存関係がないため)。これは、スレッド 2 のアサートが実際に失敗する可能性があることを意味します。
c++ - std::アトミックはサポートされていませんか?
inを使用しようとしてstd::atomic<>
いますが、私のテスト ケースは Clang と GCC の両方でリンカー エラーで失敗します。何故ですか?基本的でないタイプも含め、すべてのタイプがサポートされていました。struct sigaction
std::vector
http://coliru.stacked-crooked.com/a/df4cfcbe48ecc992を参照してください。結果は
c++11 - アトミックインクリメントが通常の整数インクリメントと比較してどれだけ遅いかを測定する
最近の議論で、アトミック インクリメントが通常の整数インクリメントに比べてどれほどコストがかかるか疑問に思いました。
これを試してベンチマークするためのコードをいくつか書きました:
私が抱えている問題は、このプログラムが実行ごとに大きく異なる結果を生成することです。
これにより、ベンチマーク コード自体にバグがあるのではないかと考えてしまいます。私が見逃しているエラーはありますか?ベンチマークのための std::chrono の使用法は間違っていますか? それとも、アトミック操作に関連する OS でのシグナル処理のオーバーヘッドによる時間差ですか?
私は何が間違っているのでしょうか?
テスト ベッド:
編集: -O3 最適化でコンパイルした後、テスト実行の出力を更新しました。
編集:反復回数を増やしてテストを実行し、ループ合計を追加して、Adam が提案したようにループされたインクリメントからの最適化を防止した後、より収束した結果が得られます。
c++ - マップ内の移動不可能なオブジェクトをその場で構築する
アトミックを含むマップ内にオブジェクトを構築しようとしているため、コピーも移動もできません。
私のC++リファレンスの読みは、マップemplace
がこれを行うことができるはずだということです。ただし、コンストラクターが削除されているか存在しないため、次のコードはコンパイルされません。使用make_pair
しても役に立ちません。
これは可能ですか、そうでない場合はなぜですか?
編集: コンパイラは Linux の gcc 4.8.1 です