3

C++11 29.3-p3 から:

アトミック オブジェクト M から値をロードする各 memory_order_seq_cst 操作 B が次のいずれかを観察するように、すべての memory_order_seq_cst 操作に単一の合計順序 S が存在し、影響を受けるすべての場所の「前に発生する」順序および変更順序と一致するものとします。値:

-- S で B に先行する M の最後の変更 A の結果 (存在する場合)、または

-- A が存在する場合、B に関する副作用の目に見えるシーケンスでの M の何らかの変更の結果であり、これは memory_order_seq_cst ではなく、A の前には発生しません。または

-- A が存在しない場合、memory_order_seq_cst ではない B に関する副作用の目に見えるシーケンスで M を何らかの変更した結果。

[ 注: S にロックを含めることは明示的に要求されていませんが、ロック操作とロック解除操作を含む順序に常に拡張できます。これは、それらの間の順序付けが「前に発生する」順序付けに既に含まれているためです。--終わりのメモ]

最後のメモで、「常に」とはどういう意味ですか? そのような拡張された S をサポートするように特定の実装を設計できることは理解できます。しかし、そのために設計されていない一般的な実装では、記述されたプロパティで S を拡張できるとは思えません。

ここでも同じ可視性プロパティを満たす拡張オーダーを意味しますか?

この質問を comp.std.c++ に送信しましたが、回答がありませんでした。http://groups.google.com/group/comp.std.c++/browse_frm/thread/5242fa70d0594d1b#

4

1 に答える 1

2

「いつも」とはどういう意味ですか?

常に とと一致する合計順序S+lが存在することを意味します。seq_cst ops U lock opshappens-beforeS

何故ですか

事実 1:Sは と一致する全順序HBです。

事実 2: ロック操作はHB取得/解放操作であるため、半順序で並べられます。

事実 3: にはサイクルはありませんHB

補題 1: にはサイクルはありませんS' = S union HB

証明: に循環があった場合S'、それらは の形式になります。これは、Aop1 <S Aop2 <HB Aop1任意の 2 つのアトミック操作が で比較可能でSあり、先行発生が推移的であるためです。それは事実 1 と矛盾します。

結論: 各部分順序 (= サイクルなし) には、その全順序への拡張が存在するため (トポロジカル ソートを参照)、拡張された全順序が存在しS'ます。したがって、アトミックを選択し、そこから操作をロックして、S+l.

しかし、それ用に設計されていない一般的な実装では、S をそのように拡張できるとは思えません。

このような実装は、mem_order_seq_cst要件を満たしていません。

于 2012-06-03T10:38:31.977 に答える