基礎的な質問ですけれども意外難しいかもしれません。
os: windows 7 64bit
開発環境:MS visual studio
質問:
複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、
複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか
たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。
[仮定:文字列に対する更新や書き込みはしない]
どうぞよろしくお願いします
マルチスレッドと共有変数[基礎的かもだが意外と]
Re: マルチスレッドと共有変数[基礎的かもだが意外と]
>開発環境:MS visual studio
visual studio の中の Visual C++ ですね。
>複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、
自動的に競合をさけることはありませんので、遅くなりません。もちろん、出力は混ざります。
プログラマが排他処理を書くことによって、遅くなることはあります。
>複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか
遅くなりません。
>たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。
スレッドと C++ の class をごっちゃにして考えている ?
同人誌即売会にいくので、とりあえずこの辺で失礼します。
visual studio の中の Visual C++ ですね。
>複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、
自動的に競合をさけることはありませんので、遅くなりません。もちろん、出力は混ざります。
プログラマが排他処理を書くことによって、遅くなることはあります。
>複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか
遅くなりません。
>たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。
スレッドと C++ の class をごっちゃにして考えている ?
同人誌即売会にいくので、とりあえずこの辺で失礼します。
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マルチスレッドと共有変数[基礎的かもだが意外と]
>複数のスレッドから同一長い文字列変数に書き込む場合競合を避けるために遅くなりますが、複数のスレッドから文字列変数を参照する場合も遅くなるのでしょうか
何らかの排他/同期を行えば書き込みも参照も遅くなります。
排他/同期なしの参照は非常に危険です。
>たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。[仮定:文字列に対する更新や書き込みはしない]
C++のアクセス指定子にsharedがありませんのでVBなどの言語でしょうか?
スレッドと関係ない話をされている気がしますが、アクセス指定子でWindowsに限って言えば違いはないと思います。
何らかの排他/同期を行えば書き込みも参照も遅くなります。
排他/同期なしの参照は非常に危険です。
>たとえば、文字列をprivate化にする場合と共有(shared)する場合アクセス(参照だけ)速度上の差はあるかどうかという問題です。[仮定:文字列に対する更新や書き込みはしない]
C++のアクセス指定子にsharedがありませんのでVBなどの言語でしょうか?
スレッドと関係ない話をされている気がしますが、アクセス指定子でWindowsに限って言えば違いはないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マルチスレッドと共有変数[基礎的かもだが意外と]
皆さんご返答ありがとうございます
説明不足で申し訳ございません。
自分の中で、OpenMPを想定してprivateとsharedで表現しましたが、
大変ご迷惑をお掛け致しました。
ここで「private」と「shared」とはOpenMP中のclauseで、
例えば、private(x)にすれば、変数xが某スレッド専有の変数になり、他のスレッドからアクセスできない、
逆にshared(x)にすれば、スレッド間共有変数になり競合が起きうるという話です。
競合回避の仕組みでスレッド間共有変数(shared)への書き込みが遅くなることは分かりますが、
例えば、競合回避の仕組みが一切ない場合、複数のthreadから同時に同じメモリにアクセスしようとしたら、
物理的に遅くなる可能性はあるでしょうか。
もしそうであれば、それらの変数をprivateに指定すれば、原理的に解決できるのでしょうか。
【ここでいう変数とはconst char* のような文字列です。】
また宜しくお願い申し上げます
説明不足で申し訳ございません。
自分の中で、OpenMPを想定してprivateとsharedで表現しましたが、
大変ご迷惑をお掛け致しました。
ここで「private」と「shared」とはOpenMP中のclauseで、
例えば、private(x)にすれば、変数xが某スレッド専有の変数になり、他のスレッドからアクセスできない、
逆にshared(x)にすれば、スレッド間共有変数になり競合が起きうるという話です。
競合回避の仕組みでスレッド間共有変数(shared)への書き込みが遅くなることは分かりますが、
例えば、競合回避の仕組みが一切ない場合、複数のthreadから同時に同じメモリにアクセスしようとしたら、
物理的に遅くなる可能性はあるでしょうか。
もしそうであれば、それらの変数をprivateに指定すれば、原理的に解決できるのでしょうか。
【ここでいう変数とはconst char* のような文字列です。】
また宜しくお願い申し上げます
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マルチスレッドと共有変数[基礎的かもだが意外と]
そちらでしたか。
OpenMPの本格的実装をしたことがないので、どのようなC/C++に展開されているかは分かりませんが気になるなら計測してみれば良いと思います。
それにコンパイラ次第で実装が変わる気がします。
ただし、少なもともprivateだと無駄な処理は一切無いのでこれより速いことは無いのではないでしょうか。
OpenMPの本格的実装をしたことがないので、どのようなC/C++に展開されているかは分かりませんが気になるなら計測してみれば良いと思います。
それにコンパイラ次第で実装が変わる気がします。
ただし、少なもともprivateだと無駄な処理は一切無いのでこれより速いことは無いのではないでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。