問題タブ [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++ - MOV x86 命令は C++11 memory_order_release アトミック ストアを実装していますか?
このhttps://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.htmlMOV
によると、リリースされたストアはx86 (x86-64 を含む) で (メモリに)実装されます。
彼のhttp://en.cppreference.com/w/cpp/atomic/memory_orderによると
memory_order_release :
このメモリ順序でのストア操作は、解放操作を実行します。現在のスレッド内のメモリ アクセスは、このストアの後に順序を変更することはできません。これにより、現在のスレッドのすべての書き込みが、同じアトミック変数を取得する他のスレッドで可視になり、アトミック変数への依存関係を運ぶ書き込みが、同じアトミックを消費する他のスレッドで可視になることが保証されます。
memory_order_releaseを使用する場合、以前に行われたすべてのメモリ ストアは、この前に終了する必要があることを理解しています。
質問:MOV
むき出しの命令 (明示的なメモリ フェンスなし) でこの動作に十分であるとはどのように考えられるのでしょうか? MOV
前のすべてのストアを終了するようプロセッサに指示するにはどうすればよいですか?
c++ - なぜ g++ はまだ -latomic を必要とするのか
C++ 標準 2014年11 月のワーキング ドラフトの29.5 Atomic typesでは、次のように述べられています。
- ジェネリック クラス テンプレート アトミックがあります。テンプレート引数 T の型は自明にコピー可能でなければならない (3.9)。[ 注: 静的に初期化できない型引数は使いにくい場合があります。—終わりのメモ]
だから - 私が知る限り - これ:
完全に有効な標準の c++14 (および c++11) コードである必要があります。libatomic
ただし、手動でリンクしない場合、コマンド
与える-少なくともFedora 22(gcc 5.1)-次のリンクエラー:
私が書くなら
すべて順調。標準では、含める必要があるコンパイラ フラグやライブラリについて何も述べていないことはわかっていますが、これまでのところ、標準に準拠した単一ファイル コードは最初のコマンドでコンパイルできると考えていました。
では、なぜそれが私のコード例に当てはまらないのでしょうか? それでも必要な合理的な理由-latomic
はありますか、それともコンパイラのメンテナによってまだ対処されていないだけですか?
c++ - std::atomic を使用して、ミューテックスをロックせずにスレッドセーフを実現するにはどうすればよいですか?
std::mutex
状況によっては、を使用してミューテックス ( )をロックする必要がなくなりstd::atomic
、パフォーマンスが向上することを私は知っています。
このような状況に名前を付けて、できればこれを行う方法のサンプルコードを示していただけますか (どのように使用しますstd::atomic
か)?
また、ミューテックスをロックすると、ミューテックスがロックされている間は他のスレッドが作業を続行できないため、パフォーマンスが低下します。これはミューテックスの唯一の問題ですか?つまり、ミューテックスのロック/ロック解除は高価な操作ですか、それとも私が上で述べたことと同じですか?
c++ - ワーカー スレッドで std::atomic_flag を使用する際の問題
冗長で申し訳ありません。コード サンプルを最小限の機能のクラスとmain()
メソッドに凝縮するために最善を尽くしました。
が呼び出されたときに終了するようにワーカー スレッド内でatomic_flag
通知するために を使用しようとしています。_rx()
stop()
問題はワーカースレッドを作成しようとしていることにあると思いますが、
thread SanityTestThread(&SanityTest::_rx, *this);
それはどういうわけか私のものと衝突しますatomic_flag
コード サンプル (コンパイルされません):
記録として、次のように my への参照をすべて削除し、ループを for ループにatomic_flag
置き換えることで、プログラムをコンパイルして実行することができます。_rx()
コンパイラ エラー:
psこれは、g++ -pthread -std=c++0x -o SanityTest ./SanityTest.cpp