タグ付けされた質問 「stdatomic」

1
C ++ 14とC ++ 17ではstd :: atomicコンストラクターの動作が異なるのはなぜですか
C ++ 11のプロジェクトで作業していて、次のコードを試してみました #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } コンパイラエラーが発生する error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ C ++ 14でも同じ結果になります。C ++ 17に切り替えると機能します:wandbox 私はcppreferenceの違いをチェックしました: std::atomic std::atomic<T>::operator= std::atomic<T>::atomic しかし、C ++ 14とC ++ 17の間に文書化された違いはありません。C …
19 c++  c++14  c++17  stdatomic 

4
C ++ 11でStoreLoadバリアを実現する方法は?
古典的な問題の変形を解決する移植可能なコード(Intel、ARM、PowerPC ...)を記述したいと思います。 Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } ここでの目標は、両方のスレッドがやっているような状況を避けるためですsomething。(どちらも実行しなくても問題ありません。これは1回だけ実行するメカニズムではありません。)以下の私の推論に欠陥がある場合は、修正してください。 私は次のようにmemory_order_seq_cstアトミックstoresおよびloads を使用して目標を達成できることを認識しています。 std::atomic<int> x{0},y{0}; void thread_a(){ x.store(1); if(!y.load()) foo(); } void thread_b(){ y.store(1); if(!x.load()) bar(); } {x.store(1), y.store(1), y.load(), x.load()}イベントにはいくつかの単一の合計順序が必要であり、プログラムの順序「エッジ」に同意する必要があるため、これは目標を達成します。 x.store(1) 「TOは前に」 y.load() y.store(1) 「TOは前に」 x.load() foo()呼び出された場合、追加のエッジがあります: y.load() 「前に値を読み取る」 y.store(1) bar()呼び出された場合、追加のエッジがあります: …

1
C11 Atomic Acquire / Releaseおよびx86_64ロード/ストアの一貫性の欠如?
C11標準のセクション5.1.2.4、特にリリース/取得のセマンティクスに苦労しています。私は、https://preshing.com/20120913/acquire-and-release-semantics/(他のものの中でも)が次のように述べていることに注意します。 ...リリースセマンティクスは、プログラムの順序でそれに先行する読み取りまたは書き込み操作による書き込みリリースのメモリの並べ替えを防ぎます。 したがって、次の場合: typedef struct test_struct { _Atomic(bool) ready ; int v1 ; int v2 ; } test_struct_t ; extern void test_init(test_struct_t* ts, int v1, int v2) { ts->v1 = v1 ; ts->v2 = v2 ; atomic_store_explicit(&ts->ready, false, memory_order_release) ; } extern int test_thread_1(test_struct_t* ts, int v2) { int v1 …


1
アトミックタイプのベクトルを割り当てる方法は?
どうすれば、原子の型を持つベクトルのメンバーを割り当てることができますか? #include <iostream> #include <thread> #include <vector> using namespace std; int main() { vector<atomic<bool>> myvector; int N=8; myvector.assign(N,false); cout<<"done!"<<endl; } https://wandbox.org/permlink/lchfOvqyL3YKNivk prog.cc: In function 'int main()': prog.cc:11:28: error: no matching function for call to 'std::vector<std::atomic<bool> >::assign(int&, bool)' 11 | myvector.assign(N,false); | ^

1
GCCアトミックビルトインに追加の「汎用」バージョンが必要なのはなぜですか?
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.htmlによると、 type __atomic_load_n (type *ptr, int memorder) (「ジェネリック」): void __atomic_load (type *ptr, type *ret, int memorder) その後 void __atomic_store_n (type *ptr, type val, int memorder) と(「ジェネリック」) void __atomic_store (type *ptr, type *val, int memorder) 等 後者のバージョンの総称は何ですか(それは前のバージョンの総称ではありません)、なぜそれらが必要なのですか?

2
非原子型に対してstd :: atomic_refはどのように実装されていますか?
次のプロパティを適用するのはかなり難しいように思われるので、非アトミックオブジェクトに対してどのようにstd::atomic_ref効率的に(std::mutexオブジェクトごとに1 つ)実装できるのかと思います。 atomic_refを介してオブジェクトに適用されるアトミック操作は、同じオブジェクトを参照する他のatomic_refを介して適用されるアトミック操作に対してアトミックです。 特に、次のコード: void set(std::vector<Big> &objs, size_t i, const Big &val) { std::atomic_ref RefI{objs[i]}; RefI.store(val); } 同じタイプのすべてのオブジェクトによって共有される大きなマスターロックでない限りstd::atomic_ref、同じものを毎回選択する必要があるため、実装は非常に難しいようstd::mutexです。 何か不足していますか?または、各オブジェクトは実装std::atomic_refを担当するため、アトミックであるか、std::mutex?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.