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

アトミック操作は不可分です。この用語は、データベース内のトランザクション、マルチスレッドプログラムでの低レベルアクセス、ファイルシステム操作などを表すために使用されます。

2
アトミックのベクトルの初期化
考慮してください: void foo() { std::vector<std::atomic<int>> foo(10); ... } fooの内容は有効ですか?または、明示的にループして初期化する必要がありますか?私はGodboltを確認しましたが、問題はないようですが、この点については標準が非常に混乱しているようです。 std ::ベクトルコンストラクタは、それが挿入言うデフォルトの挿入のインスタンスstd::atomic<int>は、初期化値ビア配置をnew。 値の初期化のこの効果は当てはまると思います: 2)Tがユーザー提供でも削除でもないデフォルトコンストラクターを持つクラス型(つまり、暗黙的に定義またはデフォルト化されたデフォルトコンストラクターを持つクラスである可能性がある)である場合、オブジェクトはゼロ初期化され、その後重要なデフォルトコンストラクターがある場合はdefault-initialized。 したがって、アトミックはゼロで初期化されているように思えます。だから問題は、std::atomic<int>有効なオブジェクトの結果のゼロ初期化ですか? 答えは「実際にはそうですが、実際には定義されていません」と思いますか? 注:この回答は、それがゼロで初期化されていることには同意していますが、それがオブジェクトが有効であることを意味するかどうかについては、実際には言っていません。
12 c++  vector  atomic 

2
プログラマーレベルのC ++ std :: atomicでは何が保証されますか?
私はに関するいくつかの記事、講演、stackoverflowの質問を聞いて読みましstd::atomicたが、私はそれをよく理解していることを確認したいと思います。MESI(または派生した)キャッシュコヒーレンシプロトコル、ストアバッファー、キューの無効化などで遅延が発生する可能性があるため、キャッシュライン書き込みの可視性とまだ少し混乱しています。 私はx86がより強力なメモリモデルを持っていることを読みました。キャッシュの無効化が遅れると、x86は開始された操作を元に戻すことができます。しかし、私は今、プラットフォームに関係なく、C ++プログラマーとして何を想定すべきかについてのみ興味があります。 [T1:スレッド1 T2:スレッド2 V1:共有アトミック変数] std :: atomicは、 (1)変数でデータ競合は発生しません(キャッシュラインへの排他的アクセスのおかげ)。 (2)使用するmemory_orderに応じて、(バリアを使用して)順次整合性が発生することが保証されます(バリアの前、バリアの後、またはその両方)。 (3)T1のアトミック書き込み(V1)の後、T2のアトミックRMW(V1)はコヒーレントになります(そのキャッシュラインはT1に書き込まれた値で更新されます)。 しかし、キャッシュコヒーレンシープライマーの言及として、 これらすべての意味は、デフォルトで、ロードが古いデータをフェッチできることです(対応する無効化リクエストが無効化キューに置かれていた場合)。 それで、次は正しいですか? (4)std::atomicT2がT1のアトミックwrite(V)の後にアトミックread(V)の「古い」値を読み取らないことを保証しません。 (4)が正しいかどうかの質問:T1のアトミック書き込みが遅延に関係なくキャッシュラインを無効にする場合、アトミックRMW操作がアトミック読み取りではなく無効化が有効になるのをT2が待機しているのはなぜですか? (4)が間違っている場合の質問:スレッドは実行時に「古くなった」値を読み、「それが見える」のはいつですか? 回答ありがとうございます アップデート1 だから私はそのとき(3)について間違っていたようです。次のインターリーブを想像してください。最初のV1 = 0の場合: T1: W(1) T2: R(0) M(++) W(1) この場合、T2のRMWはW(1)の後に完全に発生することが保証されていますが、それでも「古い」値を読み取ることができます(私は間違っていました)。これによると、atomicは完全なキャッシュコヒーレンシを保証せず、順次一貫性のみを保証します。 アップデート2 (5)この例を想像してみてください(x = y = 0でアトミックです): T1: x = 1; T2: y = 1; T3: if (x==1 && y==0) print("msg"); …

1
このC ++ AtomicInt実装は正しいですか?
前提:私はARM組み込み(ほとんどベアメタル)環境で作業していますが、C ++ 11(も)さえ使用できないので、「標準のC ++のみを使用するstd::atomic<int>」などの回答は避けてください:できません。std::atomic<int> このAtomicIntのARM 実装は正しいですか?(ARMアーキテクチャがARMv7-Aであると想定) 同期の問題が発生していますか?それはvolatile必要/便利? // File: atomic_int.h #ifndef ATOMIC_INT_H_ #define ATOMIC_INT_H_ #include <stdint.h> class AtomicInt { public: AtomicInt(int32_t init = 0) : atom(init) { } ~AtomicInt() {} int32_t add(int32_t value); // Implement 'add' method in platform-specific file int32_t sub(int32_t value) { return add(-value); } int32_t inc(void) { …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.