返信する: 汎用質問板



オプション

参照

Re: Thread間のデータ共有の仕組みについて
投稿者: SHOO 投稿日時: 2013/10/16 1:39
御返事遅くなりまして申し訳ありません。
ご回答いたします。

>上記のコードでWriter.write_tgを呼んだ場合、Writer.write_spawnを呼んだ場合と違ってWriter._cntがThread間でデータ共有されているようなのですが、これはどういった仕組みなのでしょうか?

D言語では、グローバル変数やstatic変数はデフォルトでスレッドローカルストレージに配置され、sharedストレージクラスにしないと複数のスレッドから操作することができません。
言い換えると、グローバル変数やstatic変数以外はスレッド間で共有することができるのです。

spawnでは、基本的にグローバル領域か引数を通してしか関数外の変数にアクセス出来ないため、引数の型をチェック(hasUnsharedAliasingな引数がないことを確認)することでスレッドを超えたデータ共有を制限しています。

また、spawnで共有データを参照していない(スレッドローカルストレージのデータを参照している)ように見えるのは、spawnのシグニチャが

Tid spawn(F, T...)( F fn, T args )

だからですね。(T args、となっていて、ref引数ではない)
すなわち、spawnを呼び出した時点で、_cntのコピーが作成され、そのコピーをwriteのrefによって参照してカウントアップを行っている(元のデータは更新されない)、ということです。


> データ共有するためにはsharedをつけるか、immutableなデータとして扱うか、の2通りしかない

その認識であっていますよ。ただし、sharedとデータがスレッドローカルストレージに配置されるかどうかの関係は、グローバル変数とstatic変数で使われる場合だけ関係します。

参考: http://qiita.com/mono_shoo/items/c759e64ebc1c8507b483
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu