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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その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】
【言語】
【実行環境】
【その他特記する事項】
2デフォルトの名無しさん:2012/06/15(金) 01:35:25.58
■関連スレ・関連性の高いスレ

ネットワークプログラミング相談室 Port28
http://toro.2ch.net/test/read.cgi/tech/1334736934/
3デフォルトの名無しさん:2012/06/15(金) 03:59:42.18
>>1

前スレ >>994
並列実行「可能」でも「スケールする」かは知らんぞ。

OpenMP なら !$omp parallel do としてコンパイルオプション /Qopenmp
4デフォルトの名無しさん:2012/06/15(金) 16:15:07.07
>>前すれ995
そういうオプションがあるのですね,レポートと書き直したソースを添付します.

http://www5.puny.jp/uploader/download/1339744079.zip
pass:giko

potential OUTPUT 依存関係
らしいですが,ググってもよくわかりません.依存関係がないように>>前すれ999のようにpureに書き換えたのですが.

>>前すれ997
これは試しにつけてみただけのものです,やはり使い方が違いますか・・.
5デフォルトの名無しさん:2012/06/15(金) 18:14:50.61
gfortran -O3 20120528_fast_pararell_subroutine.f90 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=2
6デフォルトの名無しさん:2012/06/15(金) 18:54:01.14
彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど
どうすればいいかな
7デフォルトの名無しさん:2012/06/15(金) 19:08:46.12
時分割でがんばれ
8デフォルトの名無しさん:2012/06/15(金) 21:41:34.19
Analyzing loop at 20120528_fast_pararell_subroutine.f90:237
237: not vectorized: not suitable for gather D.2660_224 = *shoi_69[D.2659_223];
Analyzing loop at 20120528_fast_pararell_subroutine.f90:196
196: not vectorized: not suitable for gather D.2600_148 = *a_147(D)[D.2599_146];
Analyzing loop at 20120528_fast_pararell_subroutine.f90:150
150: not vectorized: loop contains function calls or data references that cannot be analyzed
Analyzing loop at 20120528_fast_pararell_subroutine.f90:131
131: not vectorized: not suitable for gather D.2767_169 = *a_86(D)[D.2766_168];
Analyzing loop at 20120528_fast_pararell_subroutine.f90:91
91: not vectorized: not suitable for gather D.2704_87 = *a_86(D)[D.2703_85];
Analyzing loop at 20120528_fast_pararell_subroutine.f90:37
37: not vectorized: not suitable for gather D__I_lsm.780_635 = MEM[(real(kind=8)[0:] *)D.2433_241][pretmp.758_17];
Analyzing loop at 20120528_fast_pararell_subroutine.f90:38
38: not vectorized: not suitable for gather D.2485_318 = MEM[(real(kind=8)[0:] *)D.2298_95][D.2484_317];


9デフォルトの名無しさん:2012/06/16(土) 12:26:31.55
>>4
ループ間で出力変数に依存関係があるかも、という判断。

○ i, j は value 属性を付け、b は戻り値にする。
○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。

ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (100〜0) で並列化は完了。
10デフォルトの名無しさん:2012/06/16(土) 12:48:12.18
bに依存がないことくらい解析できてもよさそうなのにね
11デフォルトの名無しさん:2012/06/16(土) 16:27:05.54
sho_det呼び出しの2重ループで並列化できるの?
12デフォルトの名無しさん:2012/06/16(土) 16:52:50.21
双子と付き合う時はマルチスレッドのチンポ子が欲しい。
13デフォルトの名無しさん:2012/06/16(土) 16:54:32.86
クリティカルセクションとかミューテクスって重いんですか?
秒間2500回とかマジキチですか?
14デフォルトの名無しさん:2012/06/16(土) 17:00:15.54
400μ秒は今のパソコン環境でも、厳しいんじゃね
何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
15デフォルトの名無しさん:2012/06/16(土) 17:19:32.25
ロックフリー!
16デフォルトの名無しさん:2012/06/16(土) 17:33:56.57
>>13
そのあたりだと、API 呼び出しのオーバーヘッドもバカにならないから
自前で実装したほうがいいんじゃね?
17デフォルトの名無しさん:2012/06/16(土) 21:17:30.95
https://gist.github.com/2841832
によれば
> Mutex lock/unlock 25 ns
18デフォルトの名無しさん:2012/06/16(土) 22:25:28.46
>>13
重いけどそれくらいならいけると思う
できるならスレッドごとにリソースもって
最後に合体させたほうが速い
194:2012/06/16(土) 23:07:53.93
申し訳ありません,並列化ですが,解決しました.
/Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました.

ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです.
このループだけ並列化したいっていうような指定ってできるのでしょうか?
20デフォルトの名無しさん:2012/06/16(土) 23:18:15.13
>>17
Mutexってスレッド数によると思うんだけどな。
シングルコアならオンキャッシュで対応できるけど、
マルチコアだったりマルチCPUだったらメモリ参照と大差ないと思う。
21デフォルトの名無しさん:2012/06/17(日) 02:24:44.41
答え教えてもらって、闇雲にやるのが今風なの?
22デフォルトの名無しさん:2012/06/17(日) 02:28:46.34
それって、単純ループがスレッド化されただけじゃねえの?
23デフォルトの名無しさん:2012/06/17(日) 03:56:01.16
実行環境に寄って自動で最適化して欲しいよね。
ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。

4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
24デフォルトの名無しさん:2012/06/17(日) 04:08:44.71
core数増えたから、早くなるってわけでもないでしょうに
25デフォルトの名無しさん:2012/06/17(日) 06:28:14.10
効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS
※ 依存性に目をつぶれという指示ではない

> 64core の対応
3日かかる計算を1時間に押し込みたいなら、やる価値はある。
1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。

そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。
スケールするとかしないとかはそういう話。
26デフォルトの名無しさん:2012/06/17(日) 14:48:00.38
速くなってくれないと高額な多コア買った意味無いんだが。
27デフォルトの名無しさん:2012/06/17(日) 19:02:58.50
それは、プログラム作ったベンダーに言え。
場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
28デフォルトの名無しさん:2012/06/17(日) 20:27:37.75
分散処理できるように考えるほうが難しいのに
道具によってはできることとできないことがあるでしょ
29デフォルトの名無しさん:2012/07/06(金) 19:30:56.61
多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。
そうしないとスケジューリングに費やすコストが無駄だ。
30デフォルトの名無しさん:2012/07/06(金) 19:38:42.21
あまり賢そうに見えないな
31デフォルトの名無しさん:2012/07/06(金) 19:45:56.15
gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。
32デフォルトの名無しさん:2012/07/06(金) 19:58:44.83
標準的な入出力は動くコア決めたほうがいいかもしれんけど
プロセス、スレッドはどのコアで動こうが関係無いような
どうせ、暇な?コアに割り当てられるだろうから
33デフォルトの名無しさん:2012/07/06(金) 20:28:22.95
linuxだとこういう指定が出来るようだ
ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html
34デフォルトの名無しさん:2012/07/06(金) 22:01:45.18
それぐらいは WindowsNT 4.0 からあるが。

SetProcessAffinityMask
http://msdn.microsoft.com/ja-jp/library/cc429334.aspx
35デフォルトの名無しさん:2012/07/06(金) 22:04:26.89
コア数とかうるさい割にapiのことは言わんのね?
36デフォルトの名無しさん:2012/07/21(土) 14:53:22.69
pスレッドについて教えてください。


関係性のない処理を行う2つのスレッドA、Bを同時に動かし始めたいのですが、

・スレッドAの待ち状態にpthread_cond_wait(&cond, &mutex1);

・スレッドBの待ち状態にpthread_cond_wait(&cond, &mutex2);

として(condは同じで、mutexが異なる)、これらを動かし始めるために別スレッドで

pthread_cond_broadcast(&cond);

をコールしたのですが、思ったとおりに動いてくれません。
なにがいけないのでしょう?
(pthread_cond_wait()の使い方を間違えている?)
37デフォルトの名無しさん:2012/07/21(土) 14:57:02.99
馬鹿には無理
38デフォルトの名無しさん:2012/07/21(土) 15:18:21.14
>>36
broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
39デフォルトの名無しさん:2012/07/21(土) 15:33:58.32
>>38
素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね

このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には
それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう?


ともかく、ありがとうございました
40デフォルトの名無しさん:2012/07/21(土) 15:42:20.05
>>39
pthreadの粒度が小さい場合、threadの実行順序がぐだぐだになるから要注意。
結論としては、充分長い処理でもない限りcond_waitは使えない。
41デフォルトの名無しさん:2012/07/21(土) 15:49:59.71
>>40
頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・

自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので
素朴なつくりでもそれなりに動いたかもしれませんが、
再現性のないトラブルが発生する前にそういう問題を認識できてよかったです

ありがとうございました
42デフォルトの名無しさん:2012/07/21(土) 16:06:39.87
>>41
去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
43デフォルトの名無しさん:2012/08/25(土) 18:20:47.36
いつでもどんな時にでも
スケジュールから外されても動かされても
大丈夫なように作るのが鉄則
44デフォルトの名無しさん:2012/08/26(日) 08:54:03.71
そうそう。
だから、Web上のサンプルは当てにならない。
45デフォルトの名無しさん:2012/08/26(日) 09:32:08.49
そもそも並列化したいのは高速に処理したいからじゃん?
サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる
まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
46デフォルトの名無しさん:2012/08/26(日) 09:34:18.81
て言うかサンプルってそういうもんだし。

そもそも >>42

> mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
> 自分が待たずにロックしちゃうことに。

って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
47デフォルトの名無しさん:2012/08/26(日) 09:57:42.57
マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ

そんなことより、マトがトマるだって・・・・・!喜w
48デフォルトの名無しさん:2012/09/01(土) 15:54:33.37
ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・


素朴なQなんですが、マルチCPUのマシンで、

@ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く

Aひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、
 スレッド単体ではなく、それの属するプロセスが渡り歩いているため



こういう理解は正しいですか?
49デフォルトの名無しさん:2012/09/01(土) 15:58:04.54
スレッドの割り当てとかはOSが決めてることだからね
OSの挙動に影響しないようなことを考えながらやりませう

マルチCPUじゃなく
単一CPUの時のスレッド等の挙動を考えてみませう
50デフォルトの名無しさん:2012/09/01(土) 16:04:51.98
同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、
せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
51デフォルトの名無しさん:2012/09/01(土) 16:11:29.80
逝ってるなマルチコアはCPU毎に命令データキャッシュ持ってるでしょ
52デフォルトの名無しさん:2012/09/01(土) 16:12:43.77
でも分岐したらダメなのでは?
53デフォルトの名無しさん:2012/09/01(土) 16:16:42.15
よく考えたら、分岐するんだったらCPU移らなくてもダメだった
ドピュッ
54デフォルトの名無しさん:2012/09/01(土) 16:27:35.25
命令の先読みとかやってるの知ってる?

同じ領域を読み込む場合に早くなるってのがキャッシなのでは?

HDDキャッシュとかも同じでしょ
55デフォルトの名無しさん:2012/09/01(土) 16:29:03.73
別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、
ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある
OSの裁量次第
56デフォルトの名無しさん:2012/09/01(土) 16:32:16.93
キャッシュ知らんでも
スレッド系のプログラム作るのには関係無いような

速度ウンタラは動いてから考えればいい話でしょ
57デフォルトの名無しさん:2012/09/05(水) 01:11:52.99
初心者の質問です

new;した領域 p があって
スレッドAは条件によってdelete p;をする
スレッドBはpを参照する

この時に
変数 blReference, blDeletingを使って

Aの処理中 delete部分
while( blReference ){ Sleep(1); }
blDeleting= true;
delete p;
p = NULL;
blDeleting = false;

Bの処理中 参照部分
while( blDeleting ){ Sleep(1); }
blReference = true;
char* cp = (char*)p:
//以下参照
blReference = false;

っていうのは安全でしょうか?
58デフォルトの名無しさん:2012/09/05(水) 04:17:50.83
>>57
先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。
要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。
つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか?
それと、cpにNULLが代入されること自体は問題ないの?
59デフォルトの名無しさん:2012/09/05(水) 06:16:48.24
weak_ptr使えハゲと言うしかないレベル
60デフォルトの名無しさん:2012/09/05(水) 08:13:29.83
weak_ptrってboost?
マルチスレッドを考慮されていたの?
61デフォルトの名無しさん:2012/09/09(日) 01:13:55.50
>>58
volatileしておけば、
まあいいんじゃない

sleep で待つのは効率はよくなさそうだけど
62デフォルトの名無しさん:2012/09/09(日) 01:44:44.97
volatile使ったとしてもコンパイラによっては安全だとは言えないんだよ
63デフォルトの名無しさん:2012/09/09(日) 01:51:51.18
安全って、思いたい理由の方に興味があるんだけど
64デフォルトの名無しさん:2012/09/09(日) 07:41:49.96
むしろ安全だといえるコンパイラを知りたい
65デフォルトの名無しさん:2012/09/09(日) 14:24:32.10
volatile使っても結果変わらない事の方が多い気がする
66デフォルトの名無しさん:2012/09/09(日) 15:54:34.19
そりゃそうだ
67デフォルトの名無しさん:2012/09/09(日) 16:30:00.96
安全だと思うと、コンピュータがそれを理解して動いてくれると思いたいのかな
68デフォルトの名無しさん:2012/09/12(水) 00:03:54.96
volatileしてダメだったケースに遭遇したことないなあ。

まあboolでの同期・排他は簡単なケースにしか使ってなくて、
まじめなのはcritical sectionとかmutexで排他・同期するから
気がついてないだけかもしれないけど。
69デフォルトの名無しさん:2012/09/12(水) 07:22:51.47
>>57
>// スレッドA
>while( blReference ){ Sleep(1); } // 1
>blDeleting= true; // 3

>// スレッドB
>while( blDeleting ){ Sleep(1); } // 2
>blReference = true; // 4

スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。
70デフォルトの名無しさん:2012/09/22(土) 01:53:58.20
>>69
InterlockedExchangePointerは?
71デフォルトの名無しさん:2012/09/29(土) 20:38:32.52
質問ですが、Windows APIのSetEvent()やWaitForSingleObject()って、
内部で適切にメモリバリアを行うことが保証されていますか?

例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長?
(メインスレッド側)
 bTerminate = true;  // volatile bool型
 _WriteBarrier();
 SetEvent(hEvent); // スレッドを起床させる

(ワーカースレッド側)
 WaitForSingleObject(hEvent);  // 起床されるまで待つ
 _ReadBarrier();
 if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理
72デフォルトの名無しさん:2012/09/29(土) 20:49:37.13
も一個、volatile bool a, b; があるとして、
 a = c;
 b = d;
の代入順序は、a, bがたとえatomicな型でvolatileだからといって
プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、
よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は
メモリバリアが 必 須 、
という理解で合っていますか
73デフォルトの名無しさん:2012/09/29(土) 21:08:56.80
>>71
http://msdn.microsoft.com/en-us/library/ms686355%28VS.85%29.aspx
> The following synchronization functions use the appropriate barriers to ensure memory ordering:
> ・Functions that enter or leave critical sections
> ・Functions that signal synchronization objects
> ・Wait functions
> ・Interlocked functions

>>72
はい
74デフォルトの名無しさん:2012/09/30(日) 00:03:39.72
>>64
javacやcscじゃね
75デフォルトの名無しさん:2012/09/30(日) 00:12:53.41
メモリバリアってのはgcc特有の表現で
atomicな処理とは関係ないんだけど
76デフォルトの名無しさん:2012/09/30(日) 00:30:58.05
>>73
dクス
SetEvent()は2番目(・Functions that signal synchronization objects)、
WaitForSingleObject()は3番目(・Wait functions)ってことでおkそうですね

>>75
メモリバリアはアウトオブオーダー実行するアーキテクチャに共通する概念であってGCC固有というわけではないですにょ
とかいろいろあるが説明がマンドクセ、
77デフォルトの名無しさん:2012/09/30(日) 00:56:39.75
ただの最適化抑止のおまじないみたいなもんだよ
78デフォルトの名無しさん:2012/09/30(日) 01:05:56.81
>>77
ちょっそれvolatileの方wwwww

まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
79デフォルトの名無しさん:2012/09/30(日) 01:13:58.15
マルチコア時代の並列プログラミング
〜ロックとメモリオーダリング〜
http://www.nminoru.jp/~nminoru/data/b2con2006_nminoru.pdf
80デフォルトの名無しさん:2012/09/30(日) 01:14:33.03
gccのvolatileってのは、ちょっと特殊なんだよ
81デフォルトの名無しさん:2012/09/30(日) 01:21:19.22
>>77,78
真相はもっと複雑怪奇だったりする
http://yamasa.hatenablog.jp/entries/2009/07/20
http://msdn.microsoft.com/ja-jp/library/bb310595%28VS.85%29.aspx

つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
82デフォルトの名無しさん:2012/09/30(日) 01:26:29.84
ここらへんの話は
 ・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛
 ・volatileによって明示的に最適化が抑制
 ・システムコール内でメモリバリアの面倒をみてくれる
 ・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる
といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので
コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
83デフォルトの名無しさん:2012/09/30(日) 01:27:48.80
アトミック変数とか作って、ド素人に誤解釈されたらどうすんだろ、この人
84デフォルトの名無しさん:2012/09/30(日) 02:22:23.12
>>81
> つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
そこで面倒を見てくれるのは「release/aquireメモリバリアとしてのみ」であることに注意。
http://yamasa.hatenablog.jp/entry/20090816/1250446250
こっちのSequential consistencyの性質は、VC++2005以降のvolatileでも持っていない。
85デフォルトの名無しさん:2012/09/30(日) 13:33:02.65
>>83
ドシロウトがなんでスレッド使った開発に加わるんだよ
86デフォルトの名無しさん:2012/09/30(日) 13:35:58.01
なんで排他の話ばっか出てくるんだ。
スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。

それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
87デフォルトの名無しさん:2012/09/30(日) 14:26:20.27
>>86
>なんで排他の話ばっか出てくるんだ。

マルチスレッドで問題になるところと言うか、排他を最近覚えた奴が
使いたくてしょうがないんだろ。
88デフォルトの名無しさん:2012/09/30(日) 15:13:14.28
>>86
スレッドの実装が違うだろう、LinuxとUNIXなら同じだが
89デフォルトの名無しさん:2012/09/30(日) 15:25:27.37
>>85
じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?
90デフォルトの名無しさん:2012/09/30(日) 16:54:17.48
>>88
boostとか抽象化レイヤー用意すればできるだろ。

しかし、仕様の安定したスレッドキューがない。
もう、自作スレッドキューを保守するのは嫌だお
91デフォルトの名無しさん:2012/09/30(日) 17:01:09.98
>>90
皮かぶせりゃいいだろうけど、

そこまでして、

そこまでしても
92デフォルトの名無しさん:2012/09/30(日) 21:04:28.14
おまえら何回C++におけるatomicとvolatileの話を繰り返せば気がすむの
93デフォルトの名無しさん:2012/09/30(日) 21:20:03.98
それしかネタがないからさ
94デフォルトの名無しさん:2012/09/30(日) 22:09:45.89
>>92
スレッドキューの話しだせ
95デフォルトの名無しさん:2012/09/30(日) 23:24:16.01
だって手法なんて先駆者が出し尽くしただろ
96デフォルトの名無しさん:2012/09/30(日) 23:53:26.29
スレッドキューって何だ?
スレッドセーフなキューってことか?
それともGCDみたいなタスクキューのことか?
97デフォルトの名無しさん:2012/10/01(月) 00:06:38.53
タスクキューのことだよ。
てかスレッドセーフなキューってなんだよ。それだったら
別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
98デフォルトの名無しさん:2012/10/01(月) 07:53:47.16
java.util.concurrent.BlockingQueueのことだろ
99デフォルトの名無しさん:2012/10/12(金) 23:18:24.02
同期処理を間違いなく設計するための、何か良い手法やツールはないですかね?

ペーペーのビギナーだというのもあるのですが、
複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、
waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、
そのデバッグで無駄に体力を消耗しています
100デフォルトの名無しさん:2012/10/13(土) 11:18:48.75
馬鹿には無理
101デフォルトの名無しさん:2012/10/13(土) 13:05:32.66
>>99
排他処理、スレッドモデルと実装を勉強すれば

ビギナーには無理と思うが
102デフォルトの名無しさん:2012/10/13(土) 18:57:49.84
>>99
もうそこは、共有している資源と mutex の一覧表作って、地道に設計してレビューで
確認するしかない。

imagix とか確認を支援するツールはあるけど。
103デフォルトの名無しさん:2012/10/13(土) 22:12:39.46
>>101
やんないと、他に仕事ないんで・・・・

>>102
かなり頭がよくないと、サラリと正しいコード書けないですよね(棋士的な意味の頭のよさ)
そうか、地道にやるしかないのか(´・ω・`)

・・・売り物なんですねimagix
自分の担当業務以外にも使えそうなので、ちょっとチーム内に紹介してみます




とりあえず、今の自分のレベルでミスりやすいところを正しく実装するための比喩をいくつか考案中です

例1
スレッド間同期は、キャッチボール
ボールを受け取る側は、しゃがんでいないとボールをキャッチできない

例2
スレッド再開時の手順は、競馬のスタートと同じ
@ゲートを閉じる(送信側mutexロック)
A馬がゲート前に並ぶ(受信側wait)
Bファンファーレが鳴る(signal)
Cゲートが開く(送信側mutex開放)
104デフォルトの名無しさん:2012/10/13(土) 23:51:02.32
mutexなんか使わずfuture、promisで凌げ
105デフォルトの名無しさん:2012/10/14(日) 17:05:55.79
>>103
転職したほうがよくね
ハロワ通いでもしてみたら
106デフォルトの名無しさん:2012/10/14(日) 18:33:06.95
まず10年間C++を勉強しろ
107デフォルトの名無しさん:2012/10/14(日) 20:43:53.62
>>106
C++関係ないやん
108デフォルトの名無しさん:2012/10/15(月) 01:03:58.39
>>103
比喩を作ることができるならすでに理解できてるんじゃないの?ってことで、
結局比喩は不要だよねって流れにならないのかな。
109デフォルトの名無しさん:2012/10/15(月) 09:17:51.40
結局無理てことか、初心者というより基本が
110デフォルトの名無しさん:2012/10/21(日) 14:23:48.88
>>103
とにかくソースコードをきれいに書け
そうすれば、ソースコードが間違いを教えてくれる
111デフォルトの名無しさん:2012/10/21(日) 14:42:59.60
>>110
> そうすれば、ソースコードが間違いを教えてくれる

おっ、なんか響きがいい言葉だな。
112デフォルトの名無しさん:2012/10/21(日) 23:06:50.68
Joel on softwareの和訳ページ『間違ったコードは間違って見えるようにする』
を紹介しようと思ったが今ちょっと繋がらないようなので原文で読んでちょ↓↓↓
http://www.joelonsoftware.com/articles/Wrong.html
113デフォルトの名無しさん:2012/10/26(金) 20:45:55.33
教えてください

g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の
効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?
114デフォルトの名無しさん:2012/10/28(日) 11:59:56.78
gdb
115デフォルトの名無しさん:2012/10/28(日) 21:28:29.42

ジ  ハ ,,ハ
デ (;゚◇゚)z
!?
116デフォルトの名無しさん:2012/12/05(水) 09:54:15.94
プロファイラでわかるのはどの部分が処理時間の何%を使ってるか
ぐらいであって、スレッドの動作効率なんていう個人の価値観みたい
なものは測定できんだろ。
117デフォルトの名無しさん:2012/12/31(月) 15:20:38.31
C#です。
C#ではローカル変数にvolatileを付けられませんが
以下の場合、最適化でスレッドの変更が反映されない場合はありますか?

var init = new ManualResetEventSlim(false);
int val = 0;
var t = new Thread(() =>
{
 val = …; // valに何らかの値を入れる
 init.Set(); // valを初期化したことを知らせる
    :
 // スレッドの処理が続く
};

t.Start();
init.Wait(); // スレッドでvalが初期化されるまで待つ
// valを使う。スレッドでの変更が反映されている?
118デフォルトの名無しさん:2012/12/31(月) 16:48:21.02
あります
119デフォルトの名無しさん:2012/12/31(月) 19:09:35.15
>>118
どういった理由でしょうか?

http://www.albahari.com/threading/part4.aspx
>The following implicitly generate full fences:
>Setting and waiting on a signaling construct

という記述を見つけたのですが、これによれば
valへの書き込みをinit.Set()より後に、valからの読み込みをinit.Wait()より前に
という事は行われないように思えるのですが。
120デフォルトの名無しさん:2013/01/01(火) 04:47:40.84
判ってるのに質問するなボケが
121デフォルトの名無しさん:2013/01/01(火) 12:37:44.23
それを否定されたから理由を聞いてるんじゃないのか
122デフォルトの名無しさん:2013/01/04(金) 04:09:28.62
C#が自ら自身の仕様を質問すること自体が。
まぁ、人間だって自身についてどれだけ知っているか怪しいもんだが。
123デフォルトの名無しさん:2013/01/05(土) 12:19:18.18
>>96
の発言で思い出した。
GCDといえば、最近WindowsとLinuxにも移植されたっぽいんだよね。
http://opensource.mlba-team.de/xdispatch/docs/current/index.html

pThreadとかWin32スレッドをローレベルで使うよりお手軽な気がする。
ちょっと試してみるわ。
124デフォルトの名無しさん:2013/01/05(土) 18:17:06.97
123だけど、
XDispatchだが、Windowsであっけなく使えた。
こりゃいいぜ。Win、Mac、Linuxで同一ソースでGrand Central Dispatchが使える。
マルチスレッドプログラミング新時代到来って感じだw
125デフォルトの名無しさん:2013/01/08(火) 19:15:30.57
XDispatchの導入記事を書いてみた。
https://docs.google.com/document/pub?id=1miIRZh8QteYzjIiU7GjcGSshTp470qHbRQUh0wf12Sw

突っ込みどころあったらご指摘よろ。
126デフォルトの名無しさん:2013/01/08(火) 20:13:02.13
libdispatch + α、って感じなのか
127デフォルトの名無しさん:2013/01/09(水) 01:22:43.52
>>126
そうみたい。
基本的にはマルチプラットフォームでやりたい場合は${ ~ }の記法とautoを使えばオッケー。
他にも標準のlibdispathには無い機能とか、Qtユーザー向けのQtDispatchとかあるみたいだけど、そこまではまだ調べられてない。
時間があったらもっと調べてみて、追記してみるよ。
128デフォルトの名無しさん:2013/01/30(水) 19:59:09.23
Win32でのプロセス間リソース共有の仕方で悩んでます

1. ポーリング=Mutexで保護された共有リソースの変更を常に監視
2. サーバー(orクライアント)スレッドでEvent監視+Mutexで共有リソースを保護

余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
(定性的な評価=プロファイルで調べろは無しでお願いします)
自分は「重さ:Mutex>>>>Event>>>>>>>CriticalSection」というイメージがあるので、
2のマルチスレッドのコンテキストスイッチの重さを考慮しても1の方が重いのではないかと考えています
129デフォルトの名無しさん:2013/01/30(水) 20:42:56.62
(゚Д゚)ハァ?
Mutexを奪い合えばいいだけだし。
130デフォルトの名無しさん:2013/01/30(水) 21:22:17.63
Event vs. Pollingは宗教戦争
131デフォルトの名無しさん:2013/01/30(水) 21:52:45.99
何もすることがなきゃ寝て待ってればいいだけ
何かしたけりゃイベント来るまでしてればよかろう
132デフォルトの名無しさん:2013/01/31(木) 08:42:39.84
Mutexが重いんじゃなくてポーリングが重いんだろ
イベントやメッセージ等の非同期通知が使えるなら、そっちのほうが軽いのは当然
133デフォルトの名無しさん:2013/01/31(木) 22:24:51.03
>>128
> Win32でのプロセス間リソース共有の仕方で悩んでます
winすれで聞いたら
> 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?
134デフォルトの名無しさん:2013/02/01(金) 07:29:56.93
効率を気にする香具師が2chで質問するとかもうね
135デフォルトの名無しさん: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

この順番が逆になることあり、てことだよね?
136デフォルトの名無しさん: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 の前に持ってきても結果は変わらないはず。
137デフォルトの名無しさん:2013/02/18(月) 21:54:23.31
>>135
WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。

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

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

>>136-138
マルチスレッドでもRAW以外は入れ替わらないよ。
140デフォルトの名無しさん:2013/02/19(火) 07:57:34.41
>>139
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
141デフォルトの名無しさん:2013/02/19(火) 09:15:14.16
lockプリフィックス使うんじゃあ
142デフォルトの名無しさん: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ごとの実装は
なかったのであまり役にたたなかったです。
144デフォルトの名無しさん:2013/02/24(日) 10:17:55.94
ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。

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

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

まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
148デフォルトの名無しさん:2013/03/02(土) 16:47:32.29
>>147
> まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か

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

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

そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
150デフォルトの名無しさん:2013/03/03(日) 20:30:18.24
>>149
ああそういうことか、それは大丈夫だと思うよ。
151 ◆0uxK91AxII :2013/03/03(日) 22:58:29.83
バーリアー!平気だもーん!
152デフォルトの名無しさん: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/
153デフォルトの名無しさん:2013/03/04(月) 09:03:05.32
マルチコアでないマルチプロセッサ構成で、
外部キャッシュや主記憶のシステムコントローラが、
CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。
Windowsではこうゆうハードウェア構成は想定してないはず。
154デフォルトの名無しさん:2013/03/04(月) 10:40:54.32
>>153
違うよ。全然違うよ。
とりあえず、これでもじっくり読め。
msdn.microsoft.com/ja-jp/magazine/jj883956.aspx
155デフォルトの名無しさん:2013/03/04(月) 11:45:37.38
ところでmfenceは何でSSE2の制御命令に分類されてるの?
156デフォルトの名無しさん: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
157デフォルトの名無しさん:2013/03/11(月) 14:35:12.41
>>155
xFENCE命令はMOVNTPS, MOVNTPD,などのNon Temporal転送命令向けの機能で、
この系統の命令だけx86のメモリモデルに従わないので専用のFENCE命令が必要となった。
このうちLFENCEとMFENCEは普通のx86命令にも効果があるが、
パフォーマンスがxchgに劣る。
158デフォルトの名無しさん:2013/03/11(月) 15:38:43.70
なんでxchgがバリアとして使えるの?
159デフォルトの名無しさん:2013/03/11(月) 17:50:17.45
メモリに対するxchgは自動的にlockを伴う
160片山博文MZパンク ◆0lBZNi.Q7evd :2013/06/18(火) 23:59:01.86
確率的にいつ終わるかわからない時間の掛かる処理をマルチスレッドを使って複数同時に
実行させると、シングルスレッドよりも早い時間で終わる確率が高くなると思うが、これについて貴様らはどう思う?
161片山博文MZパンク ◆0lBZNi.Q7evd :2013/06/19(水) 00:04:03.77
ちなみにクロスワード自動作成ソフトを作ってますっ
162デフォルトの名無しさん:2013/06/19(水) 01:02:30.98
辞書ひく時間が糞長いから、マルチスレッドやっても大して変わらない
163デフォルトの名無しさん:2013/06/19(水) 06:32:32.99
>クロスワード自動作成ソフト

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

並列動作させたい複数の処理を細切れにしてちょっとづつ実行して
グルグル回す。
174デフォルトの名無しさん:2013/06/21(金) 15:03:05.45
>>173
タイムシェアリングみたいにやるってことですか
175デフォルトの名無しさん: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
スレち
177デフォルトの名無しさん:2013/06/21(金) 19:52:56.34
スレチというほどじゃないんじゃない?

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

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

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

C++のBoostを利用したThreadプログラミングの解説ページがあったので今はそれ見てます
191デフォルトの名無しさん:2013/11/23(土) 09:00:39.63
>>190
触ってもいいお
192デフォルトの名無しさん: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
マルチスレッドって自力だとどうやって書くの?
195デフォルトの名無しさん:2014/02/23(日) 09:43:27.54
pthread_create()
196KUSO KOTE ◆unko./w.Osri :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作るときにマルチスレッドは自作したんじゃなかったっけ?
198デフォルトの名無しさん:2014/02/24(月) 18:45:47.70
なんとかしてこれを読むと良い
ttp://ci.nii.ac.jp/naid/40000002652
199デフォルトの名無しさん:2014/02/25(火) 00:18:34.64
>>197
あれ、シングルスレッドだよ。
Windows3.1みたいな方法で複数のタスク回してる。
200デフォルトの名無しさん:2014/02/25(火) 06:43:17.74
小学生がBASICで弾の連射実装してるレベルだろ。
201デフォルトの名無しさん:2014/02/25(火) 12:01:20.77
グリーンスレッドとは違うの?
202デフォルトの名無しさん:2014/02/25(火) 17:16:14.73
グリーンスレッドなんて初耳。wikip見たらなんかトンデモな説明なんだが。
これは誰が言い出したんだ? バズワードくさい。
203デフォルトの名無しさん:2014/02/25(火) 17:27:19.90
レッドスレッド、ブルースレッドはあるのでしょうか?
204デフォルトの名無しさん:2014/02/25(火) 17:28:25.61
OSが関与しないスレッドの実装のこと。ウィキペディアの記述がタコってるのはいつものこと。

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

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

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

おれもいっぱい考えました。
212デフォルトの名無しさん:2014/02/26(水) 08:36:42.11
グリーンPC
グリーンディスプレイ

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

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

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

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

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

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

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

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

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

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

もうアホかと。しかもJavaの〜とかふざけてるとしか。
228デフォルトの名無しさん:2014/02/26(水) 21:45:14.58
ワロタw
229デフォルトの名無しさん:2014/02/26(水) 21:46:50.48
中途半端に脳内完結してるんだろな
230デフォルトの名無しさん:2014/02/26(水) 21:49:16.49
グリーンスレッド言ってた >>222 が定義を言わず逃げちゃった。

グリーンラナウェイ。
231デフォルトの名無しさん:2014/02/26(水) 22:31:24.56
ファイバー、タスク、ユーザーレベルスレッドと呼ばれ方はあるが
スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ
OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ
もしやOSを書いたことも言語処理系を書いたこともないのか?
232デフォルトの名無しさん:2014/02/26(水) 22:43:21.83
意味負
233デフォルトの名無しさん:2014/02/27(木) 06:36:49.81
>>227
JavaのThreadクラスの何処がふざけてるんだ?
234デフォルトの名無しさん:2014/02/27(木) 07:43:24.03
>>231
さっさとおまえの定義を言えよ、低脳。
235デフォルトの名無しさん:2014/02/27(木) 07:47:45.64
もはや人格攻撃しかできないモードに縮退したか。
236デフォルトの名無しさん:2014/02/27(木) 07:49:46.46
POSIXのスレッドAPIを実装したものがスレッド、という定義でいいだろ。
237デフォルトの名無しさん:2014/02/27(木) 07:54:15.34
トンデモグリーンスレッド連呼してたのにそのスレッドの定義聞いたら答えないで
逃げ回ってるんだからもはや人格の問題でしかない。

クズである。
238デフォルトの名無しさん:2014/02/27(木) 08:07:04.32
おまえが自分の定義と違うものに聞く耳を持たないクズってだけじゃないか。

自分がクズだろ。
239デフォルトの名無しさん:2014/02/27(木) 08:56:57.51
>>237
自己紹介乙、でどうでしょう
240デフォルトの名無しさん:2014/02/27(木) 09:11:19.33
>>238
その定義ってどれ?w いいかげにんしろよ、クズ。
241デフォルトの名無しさん:2014/02/27(木) 10:03:13.14
いい加減スレチ
242デフォルトの名無しさん:2014/02/27(木) 12:12:54.02
グリーンスレッドはどう考えてもスレッドじゃないからな。
スレチ。
243デフォルトの名無しさん:2014/02/27(木) 12:47:18.23
コンテキストの切り替えが出来るならスレッドの範疇でいいとちゃうの
LWTやFiberも範囲でいいだろ
244デフォルトの名無しさん:2014/02/27(木) 15:48:00.75
Java屋は馬鹿だからな。なに言っても無駄。
245デフォルトの名無しさん:2014/02/27(木) 17:43:54.80
馬鹿でわるかったなー
246デフォルトの名無しさん:2014/02/27(木) 18:44:32.81
キチガイに触るな
居座っちゃうだろ
247デフォルトの名無しさん:2014/02/28(金) 03:22:01.11
マルチスレッドとタイムシェアリングは違うの?
248デフォルトの名無しさん:2014/02/28(金) 04:10:21.51
>>247
まずプロセスとスレッドの違いを理解してから
249デフォルトの名無しさん:2014/02/28(金) 06:26:56.06
まずグリーンプロセスとグリーンスレッドの違いを説明してほしい。
250デフォルトの名無しさん:2014/02/28(金) 22:47:18.43
グリーンスライムよりは手強そうなイメージ
251デフォルトの名無しさん:2014/03/01(土) 06:43:57.25
グリーンプロセス()
252デフォルトの名無しさん:2014/03/01(土) 13:24:07.27
このスレはカーネルレベルでの実装オンリーのスレになりました、ってことでFAね。
あるいは「カーネル型」のw
253デフォルトの名無しさん:2014/03/01(土) 13:27:09.68
まだいるのかグリーンスレッド君
254デフォルトの名無しさん:2014/03/01(土) 14:11:27.38
まだいるのかカーネル至上主義者君
255デフォルトの名無しさん:2014/03/01(土) 14:14:20.18
v-sync割り込みでマルチタスクだお〜
DOS至上主義者が通りますよ〜
256デフォルトの名無しさん:2014/03/01(土) 19:50:36.19
[要出典]
257デフォルトの名無しさん:2014/03/01(土) 21:16:37.40
>>255
マウス用割り込みの方が良い。
258デフォルトの名無しさん:2014/03/02(日) 21:38:31.73
マウスの付いてるパソコンはカッコ悪い
259デフォルトの名無しさん:2014/03/02(日) 21:41:29.98
わーるかったな
260デフォルトの名無しさん:2014/03/06(木) 00:31:59.51
マルチスレッドって使えるところが限られてる
261デフォルトの名無しさん:2014/03/08(土) 13:27:50.88
これからマルチスレッドの勉強をしようと思うんだけど、
参考になるサイトとかコードとかを教えて欲しい。

特にワーカスレッドを複数立て、たくさんのデータブロックを順に渡して処理させるようなサンプルとか。
ネットを検索しても、スレッドが延々と動きつづけるか、処理が終われば使い捨てるものばかりで、
処理の終わったワーカスレッドに次のデータを渡して連続して処理させるものが見つからない。
また、可変長の演算結果を親スレッドに返す方法についても、どうすればいいのやら。
1個の結果データは固定長だけど出てくる個数が可変なので、固定長の電文を複数投げるようなイメージでも可。

動作環境はWin7-x64で、VC++を使いマルチコアCPUのコア数分ワーカスレッドを立てようと思う。
うちのは6コアなので、単純計算で6倍弱には高速化できると思う。

処理内容の原理試作としてシングルスレッドのDOSアプリとして組んで、鍵値に5を与えて動かしてみた結果、
データブロック数は320万個余り、データブロック1個あたりの演算結果はゼロ〜100KBと幅があるw
そして総処理時間の見込みは60〜150時間(まだ終わってない)。
鍵値を6にするとブロック数も処理時間も莫大に跳ね上がるから、
たぶん1台のPC内で完結させようとしても終わらない。
262 ◆0uxK91AxII :2014/03/08(土) 15:25:57.27
使い捨てと使い回しで、クロックにして1k~2kくらいの差が有るかどうかだから、使い捨てでOK。
263デフォルトの名無しさん:2014/03/08(土) 15:49:40.12
HotspotVMは?
と無茶振りしてみる
264デフォルトの名無しさん:2014/03/08(土) 15:57:35.44
VCならOpenCLかC++AMP使えば良いんじゃね
CPUとGPUで切り替えも出来るし
CPUだけならPPLでも
265デフォルトの名無しさん:2014/03/08(土) 16:20:54.15
VS2013か2012で、C++11のstd::threadとblockingできるqueueとstd::futureあたりを使えばいいんじゃないかな。
266デフォルトの名無しさん:2014/03/09(日) 12:57:11.91
>262-265
トン

スレッドの使いまわしについて、ちょっと説明が言葉足らずだったかな。
やりたいのは最初にn個を起動するのまでは同じなんだけど、
データブロックを1個処理し終わったら次のデータブロックを処理させることで
全てのデータブロックを処理し終わるまでn個を実行している状態を維持したい。
(実際にスレッドをループさせるか破棄/生成を繰り返すかは重要ではない。)
ググって見つけたサンプルは、n個のスレッドを最初に起動して、
n個全てが終わるのを待って次の処理(結果表示とか)に進むような使い方のばっかりで、
起動したうちの1個でも終わったら次の処理をやってまた1個終わるのを待つ、みたいなのが見つからない。


開発環境については、実は結構古いのしか持ってない……
ので、これからVS2013の評価版をDLして試してみようと思う。

現状のx86コード、シングルスレッドでどうやら鍵値5の処理を70時間以内で終われそうな予感。
処理結果のファイルを分割し過ぎて恐ろしい数のファイルを生成しちゃってるので、
マルチスレッド化の際にはもっと纏めてしまわないとなぁ。
鍵値6は複数台のPCへの分散処理とかGPU処理とかを真面目に考えないと無理そうだけど。
267デフォルトの名無しさん:2014/03/09(日) 17:54:14.90
そこまで仕様が決まってるならさっさと書けよって話だが。
268デフォルトの名無しさん:2014/03/09(日) 19:14:48.84
自慢
269デフォルトの名無しさん:2014/03/09(日) 19:44:21.54
なんの?w
270デフォルトの名無しさん:2014/03/09(日) 21:24:29.64
典型的なコード書けない君だったか。
271デフォルトの名無しさん:2014/03/09(日) 21:29:22.95
>>261
OpenMPのparallel forで分割するだけでおk
272265:2014/03/10(月) 02:53:54.21
>>271
もしも、それで済む用件だったら、一番楽だね。
VS2012と2013なら、無料版でもOpenMP使えるし。
手元のコードでOpenMPでforループ2048周をi7-3760Xで6倍速度くらい。
CUDAで780Tiで2048*2048cudaスレッドでさらに18倍くらいだった。
273デフォルトの名無しさん:2014/03/10(月) 06:30:44.63
266の処理は、OpenMPのparallel for schedule (dynamic)でできる
274デフォルトの名無しさん:2014/03/10(月) 12:00:01.04
ここはおまえの日記じゃねーぞ。
275デフォルトの名無しさん:2014/03/10(月) 17:32:15.14
スレッドの数って
CPUのコア数より多くしても意味ないよね?
276デフォルトの名無しさん:2014/03/10(月) 17:42:02.40
>>275
スレッド内の処理でI/O待ちとかしてる場合は意味あるんじゃないの?
277デフォルトの名無しさん:2014/03/10(月) 18:28:34.27
ひたすら計算し続けるなら意味はない。
計算メインというだけならコア数の倍ぐらいまでは
スループットが上がることはある。
278デフォルトの名無しさん:2014/03/10(月) 19:11:36.58
書きたいアルゴリズムを自然に書けるという理由で
マルチスレッドに意味があることはある
GUIなんかそうだろうね
279デフォルトの名無しさん:2014/03/10(月) 19:22:36.70
そんなGUIの実装は見たこと無いです。
280デフォルトの名無しさん:2014/03/10(月) 19:40:06.12
GUI スレッドと別に好きなスレッドを立ててうまくやっていけるってことだろうに‥‥
win16 の泣きそうな世界を知らないのか?
281デフォルトの名無しさん:2014/03/10(月) 19:46:18.78
それはCUIでも同じだろう。
282デフォルトの名無しさん:2014/03/10(月) 21:47:19.99
処理内容・数によるけど大量のパラ処理はCPUのマルチコアやNvidiaのGPGPUからAMDのGPGPUでopenCLが定番になってきたからな
そして、今後はAMDのHSAも定番になるって感じになっているし。
283デフォルトの名無しさん:2014/03/11(火) 17:20:13.24
いつGPGPUが定番になってきたんだ。
むしろまじ使えないってスルーされてる感が半端ない。
284デフォルトの名無しさん:2014/03/11(火) 20:17:22.02
それは nvidia/cuda
285デフォルトの名無しさん:2014/03/13(木) 20:09:50.61 ID:pPziPNkQ
インテルのやたらコア数が多い奴にビットコイン掘らせたらよさげよね
286デフォルトの名無しさん:2014/03/13(木) 20:31:14.10 ID:gEHR9Glb
GPGPUは特定の局面に限って言えば使えるんだが、一般の用途では
その特定の局面が存在しないというかわいそうな技術。
287デフォルトの名無しさん:2014/03/13(木) 20:32:14.41 ID:gEHR9Glb
ちなみにbit coinのマイナーはGPGPUから専用設計のASICに
主戦場が移った。消費電力が段違いなんだとさ。
GPUでやったら電気代で赤字になりそうだ。
288デフォルトの名無しさん:2014/03/13(木) 20:49:30.32 ID:/ZWTiswr
>>287
特定用途のみならICにしたほうが良いだろうな。

確かbitcoinでよく使われていたVGAはAMDだったはず。
ゲーム用VGAのGPGPU性能はいまはAMDのほうが良いのかな
289デフォルトの名無しさん:2014/03/13(木) 21:06:24.71 ID:k4ocBl+v
FPGA経由でASICな。

しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw
290デフォルトの名無しさん:2014/03/13(木) 22:02:39.26 ID:gEHR9Glb
で、自販機の下に落ちてる100円玉を地道に拾うぐらいなら
ショベルカーでATMごと盗んじゃえってのがマウントゴックス。
291デフォルトの名無しさん:2014/03/13(木) 22:18:30.00 ID:hR60BOrR
>>290
ワラタ、でもまさにソレ
MtGoxってMTGのカード売りだったと知った時の苦笑いときたら
292デフォルトの名無しさん:2014/03/14(金) 16:35:28.14 ID:8t3OXl/v
2年ほど前にbitcoin採掘をしていたが
お前らの想像の千倍くらい時間のかかる処理だったし
今もっと難しくなってるから既に個人で掘るのは無理なんじゃね
293デフォルトの名無しさん:2014/03/14(金) 16:57:23.89 ID:90E4Zs91
で、結局どのくらい掘れた?
294デフォルトの名無しさん:2014/03/14(金) 17:00:16.55 ID:UFFJd6rH
千倍台で分散する
295デフォルトの名無しさん:2014/03/14(金) 17:37:55.81 ID:p2oYKy+P
>bitcoin採掘
どういうこと?
296デフォルトの名無しさん:2014/03/14(金) 17:57:18.99 ID:I0jjMatv
>>295
むちゃくちゃ簡単に言うとBitCoinの正規のビットパターンは計算で求まる、でこれの正しい組み合わせを計算する事を採掘(マイニング)って言うだけの話
297デフォルトの名無しさん:2014/03/14(金) 17:59:12.49 ID:Sx19eOr2
>>296
ありがとん
298デフォルトの名無しさん:2014/03/15(土) 00:32:35.88 ID:IYjSi/+A
ちょいと相談。

データ処理とファイルI/Oを別スレッドに分けてstackを介してやり取りしてるんだけど、
気がつくとやたらメモリを食ってることがある。
調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。

ファイルの生成の様子なんかを観察してる限りで、2つの原因を想像。
A)処理済みデータをstackに積むのに比べてファイルに書き出す処理が追いついていない
B)stackがバカスカとメモリを確保している

ファイル書き出しのスレッドの内部処理は、共用stackからローカルstackにコピーして、
コピーが終わった時点で共用stack占有状態を開放、ローカルstackを順次書き出すようにしている。

Aは大量にデータを溜めることの無いようにファイル書き出しの頻度を上げる方法について、
Bはメモリを無駄に食わない方法について、アドバイスを聞きたい。

stackを使ったのはqueueに比べて頭が固定な分だけメモリの利用効率が高そうだったことと、
データの順番には意味がないから逆順になっても問題がないことによるものなので、
別のコンテナを使ったほうがいいなら、それでも構わない。
299デフォルトの名無しさん:2014/03/15(土) 00:45:28.81 ID:CF1cuZUb
>>298
そもそも一旦メモリに載せる必要があるのか?非同期IOじゃだめ?
どうしても載せなきゃいけないとして、Aはあまり意味がない。
よほど頭の悪い実装をしてなければ、現状メモリを喰ってるってことは
inputよりoutputの方が遅いってことだ。頻度で解決する問題じゃない。
Bの方は、conditon variableでスタックのサイズが一定より大きくなったら
inputを待たす方法が一番簡単じゃないか。
300 ◆0uxK91AxII :2014/03/15(土) 01:15:15.11 ID:4evGY2gy
>調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。
常識的に考えてバグ持ち。

>コピーが終わった時点で共用stack占有状態を開放、
ふつーstack<void *>。
301デフォルトの名無しさん:2014/03/15(土) 08:03:00.01 ID:B9xccETs
バッファに制限を設けて
書き込みが詰ったら待てばいいだけでは
302デフォルトの名無しさん:2014/03/15(土) 08:17:50.21 ID:kVDIpCQy
リングバッファ、そして新しいバグ
303デフォルトの名無しさん:2014/03/15(土) 08:31:05.02 ID:xmGMuN0W
リングバッファてメモリが一杯になったらファイルに書き出すように実装するのが普通?
304デフォルトの名無しさん:2014/03/15(土) 12:26:30.58 ID:GnRScPte
普通じゃない
305デフォルトの名無しさん:2014/03/15(土) 13:36:30.86 ID:royCDzaU
どうすんの?あふれたら捨てるの?
306デフォルトの名無しさん:2014/03/15(土) 13:43:41.30 ID:E7qCmrfx
環境によっては勝手にswapしてくれるかもしれない
307デフォルトの名無しさん:2014/03/15(土) 14:07:58.75 ID:PqTylRc6
>>305
ふつうは>>301の言うように空くまで書き込みを待たせるか捨てる。
待てないような要件ならサイズ固定のリングバッファじゃなく可変のキューを使うなりする。
308デフォルトの名無しさん:2014/03/15(土) 14:16:36.02 ID:1lWAVkUO
書き出すデータのフォーマットを工夫してサイズを小さくするとか、
書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。
309デフォルトの名無しさん:2014/03/15(土) 14:17:30.95 ID:y0lYdZ+H
>>307
ありがとう、バッファーの構造を別にして最大容量は設定しないといけないということですね

>>306
後出しになるけど、リアルタイムシステムのデータ収集のようなもの考えていたので
310デフォルトの名無しさん:2014/03/15(土) 16:35:55.25 ID:x1nRJa7F
いるんだよなー、そもそも不可能なことを引き受けちゃう奴って
311デフォルトの名無しさん:2014/03/15(土) 20:31:13.52 ID:9prhxYaH
てへ、昔の話がねた
312デフォルトの名無しさん:2014/03/15(土) 22:04:58.47 ID:B9xccETs
金あるならFusion-ioを使えばいい
圧縮で減るようなデータならsnappyで圧縮する
313デフォルトの名無しさん:2014/03/15(土) 23:24:57.03 ID:Jbm5xDHA
普通のリアルタイムではありえん
314313:2014/03/15(土) 23:26:35.57 ID:Jbm5xDHA
訂正 以上です
315デフォルトの名無しさん:2014/03/16(日) 01:00:35.01 ID:67pIoXcC
リアルタイムシステムというのがRTOSを使っているという意味なら
送信側か他のタスクがwait入れてなくて書き込みタスクが動いていないとかってバグじゃないかな
>>313
時代は変わりCPUを使って圧縮したほうがIOが減って低レイテンシにできる
316デフォルトの名無しさん:2014/03/16(日) 01:13:20.61 ID:CvhR8B+T
リアルタイムっていうのは入力があってから何ms以内に応答を
返せなければならないみたいなシステムのことでしょ。
コンピュータ制御の工作機械で応答が遅くて削りすぎましたとか
許されないから。
317デフォルトの名無しさん:2014/03/16(日) 01:14:58.23 ID:Va0mC41/
>261だけど、概ね期待通りの動作になってきた
速度面でも、現在使用中のPCでシングルスレッドだと70時間ほど掛かってたから、
マルチスレッド化で6コアに分散して細部の調整込みで10時間切れれば恩の字と思ってたのに、なんと4時間半を切れたw
最新のCPUを使えば2時間も夢じゃないかも

あとは演算処理orデータのやり取りのバグを潰せばほぼ完成
(結果の個数が少し足りない)
318デフォルトの名無しさん:2014/03/17(月) 12:29:47.16 ID:iella/tJ
シングルスレッドのまま細部の調整とやらだけでどこまで行くのやら
319デフォルトの名無しさん:2014/03/17(月) 15:11:57.25 ID:ot8TfsyN
どんだけ時間がかかってるのやら。
320デフォルトの名無しさん:2014/06/13(金) 00:28:43.87 ID:cRyKxN+T
共有/排他ができるロックと条件変数があるとき、これらを使って
共有から排他にエスカレーションできるロックを構成することってできる?
321デフォルトの名無しさん:2014/06/13(金) 01:34:28.10 ID:+YSiec3A
ロックとか条件変数って排他するものだよね。共有できるロックって何?
RCUのこと?
322デフォルトの名無しさん:2014/06/13(金) 08:49:59.19 ID:cRyKxN+T
ええと、いわゆるread-writeロックのこと。
323デフォルトの名無しさん:2014/11/06(木) 22:37:47.07 ID:iaZsweTc
マルチスレッドは馬鹿には無理
馬鹿は使ったほうがいいところでマルチスレッドを使わずに
使わないほうがいいところっ使ってややこしくしたりする
324デフォルトの名無しさん:2014/11/06(木) 23:24:42.11 ID:ETjlkHcn
負荷分散とか難易度高なのにね
325デフォルトの名無しさん:2014/11/09(日) 01:27:34.76 ID:UGYkYxzf
スレッディング・ビルディング・ブロックについて勉強し始めた所なんだけど、どうなの?
理解して使うと安全で早くなりそうだとは思ったが、メモリ処理の効率とかどうなるんかな?
とか思ってる所なんだけど・・・
326デフォルトの名無しさん:2014/11/09(日) 07:37:34.59 ID:SGm17f1c
安全にするには、ある程度やった人しか...
327デフォルトの名無しさん:2014/11/09(日) 22:48:01.80 ID:wyNvyEnQ
メモリ処理の効率って具体的にどういう点?
mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?
328デフォルトの名無しさん:2014/11/10(月) 09:36:09.81 ID:W8sKwQAR
オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな

>>325
コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ
329デフォルトの名無しさん:2014/11/12(水) 14:11:39.04 ID:nS55KI9v
基礎的な質問で申し訳ないのですが
同じ変数に複数のスレッドがアクセスしてはいけないのはわかりますが
同じコードに複数のスレッドがアクセスするのはいいのでしょうか?
例えば何の変数にもアクセスしない関数を複数のスレッドが同時実行するのはいいのでしょうか?
330デフォルトの名無しさん:2014/11/12(水) 14:21:32.89 ID:Tjo57cUc
ダメな理由でも探してるの?
331デフォルトの名無しさん:2014/11/12(水) 14:31:27.32 ID:nS55KI9v
>>330
今書いているプログラムで
C#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って
332デフォルトの名無しさん:2014/11/12(水) 14:35:31.55 ID:Tjo57cUc
C#のシグナルってよーしらんけど
エラーが出るってことは、質問の内容と違うことやってるんじゃないの
333デフォルトの名無しさん:2014/11/12(水) 15:18:29.39 ID:ghkKScBM
同期オブジェクトを保持している変数を上書きしていそうな気がするんだが
334デフォルトの名無しさん:2014/11/12(水) 16:32:42.96 ID:yNtQ/r84
いろいろ分かってないだけだろう
335デフォルトの名無しさん:2014/11/13(木) 06:29:27.90 ID:w/Cn+ODk
ライブラリがマルチスレッドに対応してないだけかと
336デフォルトの名無しさん:2014/11/13(木) 06:35:25.00 ID:4ACzZkWI
/MT
337デフォルトの名無しさん:2014/11/13(木) 13:44:55.73 ID:t6y7WFqt
C#ならエラーメッセージやスタックトレースが出てるだろ
338デフォルトの名無しさん:2014/11/15(土) 11:02:51.29 ID:JwZZHuNb
>>329
同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数とstatic変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ
339デフォルトの名無しさん:2014/11/16(日) 00:17:15.94 ID:lWtIBSfv
同じ変数に複数のスレッドがアクセスするならクリティカルセクションが楽だ
340デフォルトの名無しさん:2014/11/16(日) 19:55:00.63 ID:9ZsvKJox
linuxですがスレッドで同じファイルに書き込む場合、競合することってありますかね?
341デフォルトの名無しさん:2014/11/16(日) 20:11:07.08 ID:1qsvk//V
勿論。
342デフォルトの名無しさん:2014/11/16(日) 21:20:39.95 ID:4XTrCB2a
論外
343デフォルトの名無しさん:2014/11/16(日) 21:40:57.77 ID:Kyr5+wjo
>>339
もう win32 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?
344デフォルトの名無しさん:2014/11/30(日) 17:47:06.48 ID:H8djdLBQ
複数のスレッドがひとつのミューテックスのアンロックを待っていた場合、
つぎにどのスレッドがミューテックスを取得するかはランダムですか
345デフォルトの名無しさん:2014/11/30(日) 18:09:41.22 ID:ddtepLmv
はい
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
346デフォルトの名無しさん:2014/12/01(月) 00:39:51.39 ID:Az7+Eliy
いいえ
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
347デフォルトの名無しさん:2014/12/08(月) 19:13:20.61 ID:PHJZbN+V
スレッドとミューテックスだけ覚えたけど
なにを作ったらいいのかわからんたい
348デフォルトの名無しさん:2014/12/08(月) 22:37:39.16 ID:PHJZbN+V
チャット作ることにしました
349デフォルトの名無しさん:2014/12/08(月) 22:57:10.96 ID:x3KHTevM
consumerとproducerみたいのがいいんじゃないのかなと思ったけど、
チャット作ることにしたのね
がんばってください
350デフォルトの名無しさん:2014/12/08(月) 23:08:56.71 ID:PHJZbN+V
>>349
チャットで詰まったら気分変えてConsumer-Producerにも挑戦してみます
あざす
351350
>>349
いや、ありがとうございます