ページ 11

マルチスレッドと共有変数[基礎的かもだが意外と]

Posted: 2011年3月27日(日) 09:29
by コンスタント
基礎的な質問ですけれども意外難しいかもしれません。
os: windows 7 64bit
開発環境:MS visual studio

質問:
複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、
複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか
たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。
[仮定:文字列に対する更新や書き込みはしない]

どうぞよろしくお願いします

Re: マルチスレッドと共有変数[基礎的かもだが意外と]

Posted: 2011年3月27日(日) 10:21
by あたっしゅ
>開発環境:MS visual studio

visual studio の中の Visual C++ ですね。


>複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、

自動的に競合をさけることはありませんので、遅くなりません。もちろん、出力は混ざります。
プログラマが排他処理を書くことによって、遅くなることはあります。


>複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか

遅くなりません。

>たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。

スレッドと C++ の class をごっちゃにして考えている ?


同人誌即売会にいくので、とりあえずこの辺で失礼します。

Re: マルチスレッドと共有変数[基礎的かもだが意外と]

Posted: 2011年3月27日(日) 12:00
by softya(ソフト屋)
>複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか

何らかの排他/同期を行えば書き込みも参照も遅くなります。
排他/同期なしの参照は非常に危険です。

>たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。[仮定:文字列に対する更新や書き込みはしない]

C++のアクセス指定子にsharedがありませんのでVBなどの言語でしょうか?
スレッドと関係ない話をされている気がしますが、アクセス指定子でWindowsに限って言えば違いはないと思います。

Re: マルチスレッドと共有変数[基礎的かもだが意外と]

Posted: 2011年3月27日(日) 12:58
by コンスタント
皆さんご返答ありがとうございます
説明不足で申し訳ございません。
自分の中で、OpenMPを想定してprivateとsharedで表現しましたが、
大変ご迷惑をお掛け致しました。
ここで「private」と「shared」とはOpenMP中のclauseで、
例えば、private(x)にすれば、変数xが某スレッド専有の変数になり、他のスレッドからアクセスできない、
逆にshared(x)にすれば、スレッド間共有変数になり競合が起きうるという話です。

競合回避の仕組みでスレッド間共有変数(shared)への書き込みが遅くなることは分かりますが、
例えば、競合回避の仕組みが一切ない場合、複数のthreadから同時に同じメモリにアクセスしようとしたら、
物理的に遅くなる可能性はあるでしょうか。
もしそうであれば、それらの変数をprivateに指定すれば、原理的に解決できるのでしょうか。
【ここでいう変数とはconst char* のような文字列です。】

また宜しくお願い申し上げます

Re: マルチスレッドと共有変数[基礎的かもだが意外と]

Posted: 2011年3月27日(日) 15:09
by softya(ソフト屋)
そちらでしたか。
OpenMPの本格的実装をしたことがないので、どのようなC/C++に展開されているかは分かりませんが気になるなら計測してみれば良いと思います。
それにコンパイラ次第で実装が変わる気がします。

ただし、少なもともprivateだと無駄な処理は一切無いのでこれより速いことは無いのではないでしょうか。