2

メンバー関数とは異なり、使用するmemory_orderを指定できないようです。そのため、最終的に使用される「デフォルト」が存在する可能性があります。

4

2 に答える 2

7

デフォルトは「逐次一貫性」です。

于 2012-07-21T16:34:10.313 に答える
6

C ++標準(§29.7/ 35)によると、非アトミックベースタイプのアトミックタイプの呼び出しの効果、つまり次のいずれかです。operator++AC

C A::operator++() volatile noexcept;
C A::operator++() noexcept;

はメンバー関数を呼び出す場合と同じであり、fetch_add(1) §29.5(初期宣言)に従って、後者はデフォルトの引数で宣言されます。

C fetch_add(C, memory_order = memory_order_seq_cst) volatile noexcept;
C fetch_add(C, memory_order = memory_order_seq_cst) noexcept;

整数型Cの場合、および:

C* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) volatile noexcept;
C* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) noexcept;

アドレスタイプの場合。つまり、によって使用されるデフォルトのメモリ順序operator++はですmemory_order_seq_cst

規格は、についてそのような声明を出していませんが、この文脈では、operator+=真実であることが真実であると仮定するのは自然なことのようです。operator++operator+=

また、標準で定義されているアトミックタイプの関数には一般的な規則があることに注意してください。

(§29.6.5/ 2)[...]で終わらないフリー関数は、.のmemory_order引数に_explicit対応するセマンティクスを持っています。_explicitmemory_order_seq_cst

于 2012-07-23T02:26:00.397 に答える