マルチスレッドプログラミング相談室 その9

2012/06/15(金) 01:31:57.88
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その8
http://toro.2ch.net/test/read.cgi/tech/1253521167/

■過去スレ
その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html
その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/
その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/
その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/
その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/
その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/
その7 ttp://pc12.2ch.net/test/read.cgi/tech/1215253576/

OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ
【OS】
【言語】
【実行環境】
【その他特記する事項】
2013/01/30(水) 20:42:56.62
(゚Д゚)ハァ?
Mutexを奪い合えばいいだけだし。
2013/01/30(水) 21:22:17.63
Event vs. Pollingは宗教戦争
2013/01/30(水) 21:52:45.99
何もすることがなきゃ寝て待ってればいいだけ
何かしたけりゃイベント来るまでしてればよかろう
2013/01/31(木) 08:42:39.84
Mutexが重いんじゃなくてポーリングが重いんだろ
イベントやメッセージ等の非同期通知が使えるなら、そっちのほうが軽いのは当然
2013/01/31(木) 22:24:51.03
>>128
> Win32でのプロセス間リソース共有の仕方で悩んでます
winすれで聞いたら
> 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?
2013/02/01(金) 07:29:56.93
効率を気にする香具師が2chで質問するとかもうね
2013/02/17(日) 17:37:32.78
>>79ではx86、x64では(P6〜)
 RAR WAR WAW RAW
  ×  ×   ×   ×   ... × 順序の逆転が起きる WAR ... Write after Read (書いてから読む)

となってるけど>>81のMSDNでは WAR のみ逆転が起こる、書いてる。
 RAR WAR WAW RAW
  ○  ×   ○   ○

どっちが正しいのでしょうか?

あと、MSDNの英語の原文はこっちだけど
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418650(v=vs.85).aspx
Reads moving ahead of writes の訳が
「読み取りを書き込みの先に移動する」
「書き込みの前に読み取りを移動」
と2回出てきて紛らわしい。

write
...
read

この順番が逆になることあり、てことだよね?
2013/02/17(日) 21:17:44.97
>>135 それ RAW じゃね

シングルスレッドのメモリ命令は RAW (対象アドレスが被らない) と
WAW (命令による) の特定ケースを除いて命令順通り、
マルチスレッドの各スレッド間では、全パターンに入れ替えの可能性あり。

たぶん MSDN の記載は誤解を招くかと。
こちらの根拠は以下の Volume 3A, Chapter 8.2

Intel 64 and IA-32 Architectures Software Developer's Manuals
ttp://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

write -> 0x1000
...
read -> 0x2000

と明らかに異なる場所へのアクセスであり、... の間に他のメモリアクセスが
無ければ、read を write の前に持ってきても結果は変わらないはず。
2013/02/18(月) 21:54:23.31
>>135
WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。

でいいかと。
138137
垢版 |
2013/02/18(月) 22:30:08.38
>>137の補足しとくと、同一プロセッサでも異なるアドレスだとリオーダ可能なので
順序が重要な場合はメモリフェンスが必要になる。
別のプロセッサ間でもリオーダ可能ということになる。

別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。
2013/02/18(月) 23:53:52.86
>>135
MSDNのほうが正しい。
昔はIntelのdeveloper manualの記述が曖昧だったこともあり、
間違った解説が結構ある。

>>136-138
マルチスレッドでもRAW以外は入れ替わらないよ。
2013/02/19(火) 07:57:34.41
>>139
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
2013/02/19(火) 09:15:14.16
lockプリフィックス使うんじゃあ
2013/02/23(土) 20:04:20.23
>>139
そうか、マルチスレッドでもリオーダは無いな。他から割り込まれる可能性があるだけだ。
143135
垢版 |
2013/02/23(土) 23:41:17.41
>>136-142さん、さんくすでした。
MDSNが正しかったのですか。

> それ RAW じゃね
でした。コードの順番と英語表記は逆になるんですよね。誤解してました・・・。

この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。
2013/02/24(日) 10:17:55.94
ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。

CPU内の順序はOut of Orderが関係していて、CPUは可能な限り速く実行しようとするから
順番が入れ替わってしまうってことで、それをコントロールするのにメモリバリア命令がある。
アセンブラの最適化にも関係してるから、プロセッサの最適化マニュアルとかも参考になるかも。

マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。
他のプロセッサに割り込まれて困る部分にはlockで保護するとか。
2013/02/26(火) 14:50:30.35
Java の資料だけど「コンパイラ開発者のためのJSR133クックブック」ってのはどう?
2013/02/27(水) 12:54:04.48
>>145
邦訳版はダメ。
肝心のアーキテクチャ毎の表などが古いままで間違っている。
2013/02/27(水) 23:21:29.29
RafterWってシングルスレッドなら絶対安全?
途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと?
実行cpuが変わることあるかしらないけど

まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
2013/03/02(土) 16:47:32.29
>>147
> まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か

普通に入れ替わるだろ。
切替前に読み込んだ情報は、違う CPU でもちゃんと復帰するから
問題ないはず。
2013/03/03(日) 20:26:49.52
>>148
書き方が悪かった。

マルチプロセッサの環境でシングルスレッドのコードを実行してて、
実行CPUが変わったとしても読み書き順が入れ替わらないでしょう?

そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
2013/03/03(日) 20:30:18.24
>>149
ああそういうことか、それは大丈夫だと思うよ。
2013/03/03(日) 22:58:29.83
バーリアー!平気だもーん!
2013/03/04(月) 01:43:54.42
MemoryBarrier()の実装ってx86では単なるxchgなのな。
なんでmfence使ってないのだろう?速度では大差ないってことなのかな。

MemoryBarrier macro (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208

↓はC++11のスレッドライブラリ作った作者の本らしいんだが、pdfで全部公開されてる。
ありがたいのでだけどメモリフェンスは std::memory_order_acquire みたいな一般命令で
隠すようなコードしか書いてない。

C++ Concurrency in Action: Practical Multithreading
http://www.amazon.co.jp/dp/1933988770/
2013/03/04(月) 09:03:05.32
マルチコアでないマルチプロセッサ構成で、
外部キャッシュや主記憶のシステムコントローラが、
CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。
Windowsではこうゆうハードウェア構成は想定してないはず。
2013/03/04(月) 10:40:54.32
>>153
違うよ。全然違うよ。
とりあえず、これでもじっくり読め。
msdn.microsoft.com/ja-jp/magazine/jj883956.aspx
2013/03/04(月) 11:45:37.38
ところでmfenceは何でSSE2の制御命令に分類されてるの?
2013/03/04(月) 23:37:29.77
>>152
MemoryBarrier()はx64でもsfence/mfence使ってないな。
やっぱり処理速度の関係だろうか。
まるでenter命令並みに使えない。

x86
0000b 87 04 24 xchg DWORD PTR _Barrier$66624[esp+4], eax
x64
0003a f0 83 0c 24 00 lock or DWORD PTR [rsp], 0
2013/03/11(月) 14:35:12.41
>>155
xFENCE命令はMOVNTPS, MOVNTPD,などのNon Temporal転送命令向けの機能で、
この系統の命令だけx86のメモリモデルに従わないので専用のFENCE命令が必要となった。
このうちLFENCEとMFENCEは普通のx86命令にも効果があるが、
パフォーマンスがxchgに劣る。
2013/03/11(月) 15:38:43.70
なんでxchgがバリアとして使えるの?
2013/03/11(月) 17:50:17.45
メモリに対するxchgは自動的にlockを伴う
160片山博文MZパンク ◆0lBZNi.Q7evd
垢版 |
2013/06/18(火) 23:59:01.86
確率的にいつ終わるかわからない時間の掛かる処理をマルチスレッドを使って複数同時に
実行させると、シングルスレッドよりも早い時間で終わる確率が高くなると思うが、これについて貴様らはどう思う?
2013/06/19(水) 00:04:03.77
ちなみにクロスワード自動作成ソフトを作ってますっ
2013/06/19(水) 01:02:30.98
辞書ひく時間が糞長いから、マルチスレッドやっても大して変わらない
2013/06/19(水) 06:32:32.99
>クロスワード自動作成ソフト

どこらへんを並列化できるのん?
2013/06/19(水) 09:30:45.19
バックトラック乱れ打ちじゃねーの
165デフォルトの名無しさん
垢版 |
2013/06/20(木) 07:49:26.95
同じレスを各板に乱れ撃ちする作業だろ?
2013/06/20(木) 15:25:09.57
マルチスレッドにしたら5〜8時間に1回エラーが出るようになった。でもデバックできないよorz
2013/06/20(木) 20:17:10.50
つログ
2013/06/20(木) 22:19:34.34
同期もわかってないのにマルチスレッドにするからだ。
2013/06/20(木) 22:26:19.30
同期とったら並列の意味がなくなりそうでためらうときがあるな
待ち合わせキューにするくらいなら順番に処理した方がましな気がする
2013/06/21(金) 00:07:54.88
つスーパースカラー
2013/06/21(金) 00:28:22.79
粒度変えりゃいいじゃん
172デフォルトの名無しさん
垢版 |
2013/06/21(金) 04:34:35.98
マルチスレッドって自作できるんですか?
以前nyの書籍を読んだときに、開発者の人がマルチスレッドを自作したと書いてたような気がするのですが
C言語でも自作できるんですか?
2013/06/21(金) 04:48:19.55
マルチスレッド・マルチタスクで動いているように見せることは出来る。

並列動作させたい複数の処理を細切れにしてちょっとづつ実行して
グルグル回す。
2013/06/21(金) 15:03:05.45
>>173
タイムシェアリングみたいにやるってことですか
2013/06/21(金) 19:27:29.84
>>174
俺が>>173で書いたのは、タイムシェアリングではなく
ノンプリエンプティブ・マルチタスク。
例えば無限ループ内に3処理 A, B, C があったとして
それらをマルチで実行したければ、それぞれを
A1, A2, A3
B1, B2, B3
C1, C2, C3
などと細切れに分割し、
A1, B1, C1, A2, B2, C2, A3, B3, C3, A1, ……(無限ループ)
と実行する。

いまでも、組み込みでコントローラやセンサーを制御する小さなCPUは
マルチタスクの能力を持っていないのが当たり前のようにあり、
これでマルチ動作させるのに当たり前のように使われる手法。
176デフォルトの名無しさん
垢版 |
2013/06/21(金) 19:38:33.60
スレち
2013/06/21(金) 19:52:56.34
スレチというほどじゃないんじゃない?

OSレベルでスレッドのサポートが無い場合は、
言語ランタイムレベルのグリーンスレッド
タイマー等の割り込みの利用
メッセージポンプのループ利用
NT Fiber

スレッドはないけどプロセスのマルチが出来るなら、
パイプなどでプロセス間通信の利用
といったところかな
2013/06/21(金) 20:25:17.31
俺もスレチじゃないと思う
2013/06/21(金) 20:31:18.12
windows 3.1 を思い出すな
2013/06/21(金) 20:41:54.83
ファイバーってレアすぎ
2013/06/21(金) 22:30:00.37
>>175
win31 のことね
2013/06/21(金) 22:38:33.58
気が早いな
まだ8だぞ
2013/06/21(金) 23:18:56.88
2000があるのに…

>>175をタイムシェアリングだと思ってたな。もう少し勉強しよう。
2013/06/21(金) 23:38:19.83
ファイアー少なくてレアすぎ
2013/06/21(金) 23:40:35.43
広義だと含むのとちゃうかな
おさ〜ん的にはTSS(TSO)のホスト端末を思い浮かべるけど
2013/06/23(日) 12:58:55.01
ファイバー使ってみたけど、
フェーズとswitchより
シンプルに書けたよ。
2013/11/22(金) 08:18:08.42
C/C++ で勉強したいのですが、おすすめの書籍などありますか?
もしくは一から学べるようなWebページがあれば教えてください
188デフォルトの名無しさん
垢版 |
2013/11/22(金) 09:05:54.07
D の方が良いよ
2013/11/22(金) 13:04:58.77
猫でもわかる
2013/11/23(土) 05:39:10.02
>>188
D のほうが書きやすい?触れたことないのでわからんです
>>189
猫でもわかる は、Web版が俺にはちょっと分かりづらかった記憶が
書籍だとそうでもないのかな

C++のBoostを利用したThreadプログラミングの解説ページがあったので今はそれ見てます
2013/11/23(土) 09:00:39.63
>>190
触ってもいいお
2013/11/23(土) 13:19:59.45
>>191
どれどれ
193デフォルトの名無しさん
垢版 |
2013/11/23(土) 13:24:53.59
>>191
ペロペロ
194デフォルトの名無しさん
垢版 |
2014/02/23(日) 09:00:04.29
マルチスレッドって自力だとどうやって書くの?
2014/02/23(日) 09:43:27.54
pthread_create()
2014/02/23(日) 10:15:16.84
>>194
std::thread th{
 []{std::this_thread::sleep_for(std::chrono::milliseconds(3000));}
};
std::printf("うんこ\n");
th.join();
197デフォルトの名無しさん
垢版 |
2014/02/24(月) 17:57:18.01
例の金子がny作るときにマルチスレッドは自作したんじゃなかったっけ?
2014/02/24(月) 18:45:47.70
なんとかしてこれを読むと良い
ttp://ci.nii.ac.jp/naid/40000002652
2014/02/25(火) 00:18:34.64
>>197
あれ、シングルスレッドだよ。
Windows3.1みたいな方法で複数のタスク回してる。
2014/02/25(火) 06:43:17.74
小学生がBASICで弾の連射実装してるレベルだろ。
2014/02/25(火) 12:01:20.77
グリーンスレッドとは違うの?
2014/02/25(火) 17:16:14.73
グリーンスレッドなんて初耳。wikip見たらなんかトンデモな説明なんだが。
これは誰が言い出したんだ? バズワードくさい。
2014/02/25(火) 17:27:19.90
レッドスレッド、ブルースレッドはあるのでしょうか?
2014/02/25(火) 17:28:25.61
OSが関与しないスレッドの実装のこと。ウィキペディアの記述がタコってるのはいつものこと。

基本的な理屈はそう難しくないけど、実際にはreadとかでどれかのスレッドがプロセスごと
ブロックされると、他に走りたいスレッドが居ても走れなくなっちゃうので、そのへんを
どう手当てするかがカギ(そういった所だけOSが支援するとか、ブロックする可能性がある
システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。
2014/02/25(火) 17:33:10.94
よく分らんな。スレッドってそもそもOSが定義したものだろう。
アプリ側がたかが永続性のあるサブルーチン程度のものを
勝手にグリーンススレッドって呼んでるだけじゃないのか?

まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。
2014/02/25(火) 18:01:22.88
ユーザースレッド、ユーザ空間でか、なるほど
カーネルスレッド、カーネル空間でか、なるほど
グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん。それこそ>>203
2014/02/25(火) 18:14:03.00
ttp://dl.acm.org/citation.cfm?id=603551
↑これが「小学生がBASICで弾の連射実装してるレベルの話」に見えるのか。
さぞかしスーパープログラマ(笑)様なんだろうな。
2014/02/25(火) 18:19:01.04
その例え話しとその提示したのと繋がりそしてなんでその皮肉になるのか、200文字以内で説明しなさい
2014/02/25(火) 18:49:55.40
wikipediaのスレッドの項目の所まで加筆してやがるww
バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw

そんなのスレッドと何の関係もないのにスレッド言うなや。
2014/02/25(火) 19:49:47.38
結局、逆の意味でのウィキペディア馬鹿か。
一人で言ってろw
2014/02/26(水) 05:28:26.83
グリーンCPU。
グリーンプロセス。
グリーンヒープメモリ。
グリーンスタックメモリ。
グリーン仮想メモリ。
グリーン物理メモリ。
グリーンマルチタスク。
グリーンネットワーク。
グリーンアップル。

おれもいっぱい考えました。
2014/02/26(水) 08:36:42.11
グリーンPC
グリーンディスプレイ

が抜けている
2014/02/26(水) 08:51:32.57
ソイレント
2014/02/26(水) 13:23:35.72
MZ-80Kの話をしてるのかと思ったぜ
2014/02/26(水) 14:34:56.07
>>214
そりゃMZ80Cだ!
MZ80Kはモノクロだ!
2014/02/26(水) 17:24:33.12
> ユーザースレッド、ユーザ空間でか、なるほど
> カーネルスレッド、カーネル空間でか、なるほど
> グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん

ユーザースレッドとカーネルスレッドという言葉はそれぞれ、
M:Nスレッドモデルとかの議論で、カーネル空間のコードの実行におけるスレッドと、
ユーザー空間のコードの実行におけるスレッド、という意味で使われる。

グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
スレッドAPIの実装を指す。

以上のことが何も理解できないバカには、なにもかもがバズワードに見える。
2014/02/26(水) 17:25:22.57
バカですがなにか?
2014/02/26(水) 17:49:55.02
命名の由来のことなのに、Wikipediaから意訳したようなのを偉そうにのたまう、他人を馬鹿呼ばわりする自称天才様w
天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw
2014/02/26(水) 18:13:53.06
> バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
>
> そんなのスレッドと何の関係もないのにスレッド言うなや。

この威勢はどこ行ったのかなぁw
2014/02/26(水) 18:31:45.02
>グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
>スレッドAPIの実装を指す。

ハナからスレッドの定義に当てはまらないのにスレッド言われもなぁ。

WEB2.0と変わらんレベルの造語。
どうせまたジョブスオタクの低脳営業SEが言い出したんだろう。
2014/02/26(水) 18:36:03.83
スレッドの定義ってなんだ?
2014/02/26(水) 18:38:20.17
コイツの脳内ではシステムコールで実装されたものだけがスレッド、という定義なんだろう。
聞くだけ無駄だよ。
2014/02/26(水) 18:43:07.52
>>221
OSが管理する最小の実行スタック。
2014/02/26(水) 18:44:25.59
>>222
ではキミのスレッドの定義は?
2014/02/26(水) 19:01:36.43
222じゃないけど、スレッドっていうのはプログラムを実行する最小単位のことでいいんじゃないかな
OSが管理しているかどうかは問わない

スレッドっていう概念が実装されてるプログラミング言語が多いと思うんだけど、
この場合のスレッドはOS上の実装とは切り離されてるんだよね
例えばJavaのThreadクラスとか

OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で
抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?
2014/02/26(水) 19:17:09.57
実行スタックってなんだ、って思ったらウィキペディア(英語版含む)でそんな表現を使ってるのか。

一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。
2014/02/26(水) 20:45:20.03
>>225
そんなトンデモ言われてるも議論する気にもならん。
じゃあ、関数もスレッドなんですね。

もうアホかと。しかもJavaの〜とかふざけてるとしか。
228デフォルトの名無しさん
垢版 |
2014/02/26(水) 21:45:14.58
ワロタw
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況