真夜中のconst 性とマルチスレッド

3
やまさ @yamasa

. @Cryolite @SubaruG マルチスレッドでも安全な「immutableオブジェクト」を実現する方法は、Javaのメモリモデルを定義する際の重要なテーマの一つでした。そこでの議論はC++0xなどにも強く影響しているようです。

2010-04-13 02:01:48
普通のC++使い、銀天すばる @SubaruG

@yamasa immutable である必要は特に無いですよ?

2010-04-13 02:02:39
普通のC++使い、銀天すばる @SubaruG

@yamasa 僕が想定しているのは、あくまで、さっき挙げたレベルでのスレッド安全性を、型レベルで行えたらうれしいなー、程度のもんです。

2010-04-13 02:04:03
Akso de la Malbono @Cryolite

@yamasa 具体的に C++0x のどの部分に影響しているのか,とかご存知でしたら教えていただけますでしょうか? RT そこでの議論はC++0xなどにも強く影響しているようです。

2010-04-13 02:05:08
普通のC++使い、銀天すばる @SubaruG

ってコンパクションかー。確かにデフォでは難しいかも

2010-04-13 02:05:55
普通のC++使い、銀天すばる @SubaruG

アロケータを使って対処できるけど。

2010-04-13 02:06:44
普通のC++使い、銀天すばる @SubaruG

少なくとも vector は単純な可変長配列以外の何物でも無いわけですが。

2010-04-13 02:09:25
やまさ @yamasa

@Cryolite data-dependency orderingとかですね。Javaのfinalフィールドの実装は、C++0x的に言うとコンストラクタの最後でreleaseバリアを発行し、…

2010-04-13 02:12:44
やまさ @yamasa

@Cryolite …そのオブジェクトをdereferenceする全ての場所でconsumeバリアを発行することに相当します。

2010-04-13 02:13:09
普通のC++使い、銀天すばる @SubaruG

C++なんたから未定義動作上等(キリッ

2010-04-13 02:14:26
普通のC++使い、銀天すばる @SubaruG

厳密に~である保証をコンパイラ側にしてもらう、というより、~でなければならない、さもなくば未定義である、って方がC++らしい気がする。

2010-04-13 02:16:30
やまさ @yamasa

@Cryolite つまり、Javaのfinalと同じセマンティクスを実現しようとすると、memory_order_consume 相当のメモリバリアを暗黙的にあちこちで発行しなければならないので、C++0xでは採用されなかったんでしょう。

2010-04-13 02:16:43
やまさ @yamasa

@SubaruG スレッド安全性が型システムの中に組み込まれていれば嬉しいな、とは私も思います。ただ、それはゼロオーバーヘッド原則との両立がとても難しいと思っています。

2010-04-13 02:20:04
普通のC++使い、銀天すばる @SubaruG

@yamasa コンパイラがチェックをしようとすると大変ですけど、ユーザが宣言する形で使うのであれば、特にオーバーヘッドは起きないと思うのですが、どうでしょう。

2010-04-13 02:21:44
Akso de la Malbono @Cryolite

@yamasa 丁寧に説明してくださってありがとうございます.おおよそ自分の理解が合っているっぽい気がしないでもないということが確認できました.

2010-04-13 02:22:29
普通のC++使い、銀天すばる @SubaruG

readonlyはダサいなぁ。 immutable 辺り?

2010-04-13 02:22:33
普通のC++使い、銀天すばる @SubaruG

流石に trust me 的な発想は、もう古いのかねー。

2010-04-13 02:23:56
普通のC++使い、銀天すばる @SubaruG

(というかメモリバリアが何ゆえに絡んでくるのか理解できない。)

2010-04-13 02:26:43
やまさ @yamasa

@SubaruG 難しい問題ですね。どういう宣言を用意すれば十分なのか、じっくり考える必要がありそうです。

2010-04-13 02:27:38
普通のC++使い、銀天すばる @SubaruG

物理的に const ってことは要するに、内部状態も書き換えないし、グローバル環境も書き換えない、ってことですよね。

2010-04-13 02:28:42
やまさ @yamasa

@SubaruG メモリバリアの必要性は、double-checked lockingの迷宮に一度入ってみないとわからないかも。

2010-04-13 02:29:57
普通のC++使い、銀天すばる @SubaruG

完璧に what ではなく how の世界だけど。

2010-04-13 02:30:01
普通のC++使い、銀天すばる @SubaruG

@yamasa それが必要なのは真の const じゃないと思うのです。

2010-04-13 02:31:07
Akso de la Malbono @Cryolite

MyClass x; inter_thread_ptr = &x; // inter_thread_ptr に代入されたアドレスが 可視な状況であっても, x の初期化に関する可視性の保証は別問題.

2010-04-13 02:32:19