1 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:35:32 ] マルチスレッドプログラミングについて語るスレ。 その1 pc3.2ch.net/tech/kako/997/997345868.html その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/ その4 pc8.2ch.net/test/read.cgi/tech/1130984585/ その5 pc11.2ch.net/test/read.cgi/tech/1157814833/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他突起する事項】
175 名前:148 [2007/09/30(日) 19:21:43 ] すみませんが、本当にわかる方、回答をお願いします。
176 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 19:28:32 ] 残念だったね。
177 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 19:36:20 ] 自分でマルチスレッド対応のストリームつくればいいじゃん
178 名前:148 mailto:sage [2007/09/30(日) 19:44:05 ] >>177 そんな事したらめんどくさくないですか? もうちょっと簡単な方法でお願いします
179 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 19:49:11 ] そもそもプログラミング自体めんどくさくないですか? ありあわせのフリーソフト探してくる方法が簡単だと思います
180 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:50:56 ] そもそも生きてるってめんどくさくないですか? 氏ねば簡単ですよ
181 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:56:18 ] >>180 どうやったら楽に死ねますか? 簡単そうな方法にはちょっと勇気が必要だし、そうでないのは簡単じゃないし
182 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:09:17 ] >>180 旅立ちパックの中に 連単はいってるからつかえ 以上
183 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 22:14:37 ] >181 死ねばすべてが楽になるんだ 楽したいなら、死ぬ努力ぐらいはしてもいいだろ 俺は死にたくないから、努力して生きるよ
184 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 23:11:03 ] >>178 ストリーム出力だけロックすれば済む話だろうが〜 どこが面倒なんじゃ〜?
185 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 01:35:10 ] マルチスレッドプログラミングは初心者には無理だよ 面倒=やり方がよくわからない という事であればこの先できるようになる見込みもなし 厳しいけどこれ現実なのよね
186 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 03:15:20 ] スレッガーさん!
187 名前:デフォルトの名無しさん [2007/10/03(水) 20:59:05 ] スレッドセーフじゃない場合はどうするつもりだったのかと・・・ スレッドセーフだったらどうしたかったのかと・・・ まぁいいや、どうせネタでしょ?
188 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 15:51:11 ] 次世代ゲーム機のCPUみたいにレジスタが山ほどあるCPUて コンテキストスイッチのオーバーヘッドも比例して増えてるんかな
189 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 16:02:08 ] 一部しか保存しなくてすむようにしてあんじゃね?IA64とかそうだべ。
190 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 17:01:20 ] 64bitのレジスタ32本あるのじゃまんぞくしねーのか?
191 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 19:38:15 ] 高速なキャッシュがたくさんあれば満足する
192 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 20:11:01 ] IA64とかって確かコンテキストが2500バイトくらいいくんだよなw
193 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 21:36:08 ] おれはレジスタの数よりも、1次キャッシュに乗ってるメモリとの 演算やアクセス速度が、レジスタと同程度であれば良いと思ってる。 結局それが最強でしょ?
194 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:04:14 ] 命令セットの問題じゃね
195 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:47:19 ] だよね。 RISC系の、メモリアクセスは基本的にロード/ストアのみで 演算はレジスタに対してしか出来ない、ってアーキテクチャだと キャッシュの速度だけじゃなく、レジスタの数も欲しいはず。
196 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:58:57 ] そんなことできたら苦労は無いわ。 メインメモリにレジスタと同程度でアクセスできれば最強だな。
197 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 23:43:09 ] >>196 補助記憶装置含めて光速の99%で処理できたらおk
198 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 00:46:35 ] 発想を逆にするんだ。 レジスタへのアクセスがメインメモリと同程度に遅(ry
199 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 13:37:41 ] じゃあ、みんながのんびりすればよくね?
200 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 18:07:14 ] 俺も思う。 CPUだけじゃなくて、日本人がもっとのんびりスベキナンダヨ
201 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:55:40 ] 1ヶ月くらい休みクレ!
202 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 23:27:18 ] >>>200 いや、今の状況はさー、 のんびりすべきだ、のんびりしよう、 とか言って急ブレーキ掛けてた頃からは、 実はもうだいぶ経っててさ、逆にのんびりしすぎてるんじゃ? って密かに周りが焦り始めてるんだけど、 具体的な問題が出てくるまでは、それにあえて気付かない フリをしていよう、ってところなんだよ。 ほんとうは、そろそろ歩きださないと。いそがないと! って時なんだよ? 一度怠けると元に戻れなくなるって言うけど、それ以前に 元がどうだったかなんて忘れてるもんだからさ、 フリじゃなくてほんとうに気付いてないのかもしれないね。 日本ヤバイよー。 おれは海外に移住する予定です。
203 名前:デフォルトの名無しさん [2007/10/21(日) 20:33:43 ] SolarisでpthreadでC++です。 C* c; int main() { c = new C; と、mainの先頭で生成したオブジェクトを、N個のスレッド(実際は8個固定)から使っています。 スレッドが順次終了してゆき、最後のN個目が終了した直後、あるいはN-1個目が終了した 後かつN個目が終了する直前にdelete c;をしたいのですが、うまい方法はあるでしょうか。 リファレンスカウントでしょうか。 N個のスレッドすべてをpthread_join()するような、親スレッドはいません。 なお、Cのメンバ関数はすべてスレッドセーフに作られています。 よろしくおねがいします。
204 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:36:29 ] >>203 リファレンスカウントで何か不満なの? boost::shared_ptr ですぐに実装できそうだし。
205 名前:203 [2007/10/21(日) 20:41:02 ] >>204 boostやSTLが使用禁止なので、一から手書きする場合の例をいただけたらと。。 テンプレートは使用可です。
206 名前:デフォルトの名無しさん [2007/10/21(日) 20:47:33 ] >>204 スレッドをまたいでshared_ptrを渡すのって例えばどうやるの?
207 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 21:24:12 ] > boostやSTLが使用禁止なので ぬふぅ
208 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 21:24:57 ] >>203 代入系の演算子をoverrideしまくればそれっぽいの出来るけど、 用途をみてるとそれだけのためにshared_ptrを実装するのはもったいないな。
209 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 21:45:00 ] >>205 boost の実装見ればいいじゃん。
210 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 21:46:15 ] >>206 スレッドごとに shared_ptr のコピーを持てばいい。
211 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:17:11 ] >>210 boostのshared_ptrの参照カウントの上げ下げってスレッドセーフだっけ? 最新のstableでもなにもしてなかったような。
212 名前:203 [2007/10/21(日) 23:58:41 ] みなさまどうも。 >>210 shared_ptr<C> g; int main() { g.reset(new C); // スレッドを8つ生成 cond_wait; // スレッドがgをコピーするのを待つ g.reset(0); ... } void* thr(void* data) { shared_ptr<C> local = g; cond_signal; ... } とかですか。
213 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 04:26:17 ] チラシの裏で悪いけど、g++のbits/atomicity.hの__exchange_and_add()とか使うと、 libstdc++.soの関数を呼びに行くんだね。おそそー。
214 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 08:13:39 ] >>211 スレッドセーフではないとすると、参照カウントを上げる方は、 >>212 のやりかたでも、一個ずつスレッドを作って、 cond_waitすればいいけど、下げる方は排他制御しないと 駄目って事かな? 単純な実装にするなら、 全スレッドが共用するカウンタを作って、上げ下げすればいいんじゃないのか? 最初と最後だけなら、速さとかは気にせずに、適当な実装でも問題なさそうだし、 atomicな操作ができるなら、それこそカウンタだけ渡せば済むし。 Cがいじれるなら、自分自身でカウントしても良さそうだけど。 どうでもいいけど、>>212 は、グローバル以外の渡し方はないのか?
215 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 16:47:54 ] >>214 void* data 経由で渡して、スレッド側でstatic_cat<shared_ptr<C*>* >することは可能。 スマートポインタへのポインタを渡すことになって気持ち悪いけど。
216 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:27:07 ] どのみちmainは生きてるんだから mainでjoinで待って削除すればいいのでは
217 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 18:53:14 ] >>216 >>203 >N個のスレッドすべてをpthread_join()するような、親スレッドはいません。
218 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 21:44:40 ] クラスCをsingletonにするのは無し?
219 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 21:55:54 ] >>214 そうですね。スマートポインタは使わず、単純なカウンタ+アトミック操作でいこうとおもいます。 >>218 決してdeleteされないsingletonにするのはNGです。threadが全部いなくなったら、deleteしないとまずい 事情があります。 ありがとうございました。
220 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:05:42 ] スレッドの調停者が居ない=全てのスレッドが終了時にアプリケーションが終了 なら,singletonでも別にもんだいねーよーな気がする
221 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:12:26 ] >>220 スレッドが全部終了した段階では、アプリケーションは終了しません。 また、その段階で~C()をよばないと、いろいろまずいことがあります。
222 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:19:30 ] >>220 誰がスレッドを最終的に所有してるの?
223 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:22:45 ] 素直にスレッドのマネージャを作れば
224 名前:デフォルトの名無しさん [2007/10/22(月) 22:25:30 ] >>222 メインスレッドaを起点として、ツリー状に生成・所有されています。 a-b-c-N1 -d-N2 e-f-g-N3 -N4 -h-N5-N6 -N7 -N8 みたいなひどい感じです。Nxが、今回興味のあるスレッド群。 何でこんなことになってるのかの経緯は、私にはちょっとわかりません。。。
225 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:27:37 ] >>224 こんなはちゃめちゃになるんだったら マネージャ作れよ GCとかみたいに自分で管理したくないものは 誰か権限のあるやつだけに委譲しろよ
226 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:28:56 ] >>225 managerとは、具体的には何をするものでしょうか?
227 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:38:42 ] スレッドのリソースの管理
228 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:06:01 ] >>227 ありがとうございます。 >>214 参照カウントは、www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2167.pdf あたりを参考にすればいいのかな。 4-8個程度はCPUの乗ったSPARCが相手だと、atomic_inc/decだけでは実装できないよね。このあたりに詳しいかた、コメント いただけませんか?
229 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:11:23 ] >>228 アトミックなカウンタ操作があっても実装できない理由って何?
230 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:11:56 ] アトミック云々以前にスレッドの管理が出来てないんじゃ意味ないだろ
231 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:15:43 ] >>229 複数のCPUが同時にatomic_incを実行すると破綻するから
232 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:18:14 ] そんなのはアトミックじゃねぇ
233 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:19:53 ] >>231 その atomic_inc はアトミックじゃないのかい?
234 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:26:06 ] っSMP
235 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:27:42 ] >>232-233 そういうCPUもあるし、そうでないCPUもある。
236 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:35:39 ] そうでないCPUでは、それはただの x++ とどう違うの?
237 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:47:52 ] >>236 横から。わたしもよくわかってないが 1.コンパイラやlibcが提供するatomic_inc/dec関数だけでは、単一CPUでのアトミックな演算しか保証されない 2.適切な命令(バリア)と一緒に使えば、複数のCPUを相手にatomicなinc/decができる (memory visibilityがどーたら) 3.どういうバリアが必要かは場合によって異なるから、コンパイラやlibcが提供するatomic_inc/dec関数にはバリアが入っていないことがある こんなところじゃない?詳しい人フォローよろ。
238 名前:237 mailto:sage [2007/10/22(月) 23:52:39 ] >>237 1と2の末尾にも「ことがある」を追加
239 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:24:36 ] あー、そういう実装の既存の関数があるのね。 そこまで分かってるなら前後にメモリバリア足せばおしまいじゃね?
240 名前:デフォルトの名無しさん [2007/10/23(火) 00:29:35 ] つーかvolatileで十分w
241 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:30:04 ] atomic_inc/readはlinuxのカーネル系の関数のようだね。 pthreadのような高位のAPIを使わない理由はなんだろう? パフォーマンスを気にするようなアプリなのか。
242 名前:203 mailto:sage [2007/10/23(火) 00:31:23 ] >>241 pthreadにします。
243 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:00:33 ] >>240 キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
244 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:41:51 ] SPARCv9なら、CASがあるよ。
245 名前:デフォルトの名無しさん mailto:sageない [2007/10/23(火) 17:58:33 ] linuxのCでスレッドの排他制御をしたいのですが、 なにぶんPONIX?っていうんですか?での開発は初めてなので ご質問させてください。 pthread_mutex_t mutex; pthread_mutex_init( &mutex, NULL ); pthread_mutex_lock( &mutex ); pthread_mutex_unlock( &mutex ); PONIXではこのようにpthread_mutex_lockを使うようですが この引数pthread_mutex_t*をWin32のCreateThread()のように ある共通の識別子を持っているスレッド同士のみが排他制御を するにはどのようにすればよいのでしょうか? 例えば同じ親から4つ子のスレッドが生まれたとします。 スレッド長男と次男は排他関係 スレッド長女と次女も排他関係 でもスレッド男兄弟とスレッド女姉妹は排他関係ではない という場合です。
246 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:11:09 ] 必要なだけ mutex を作って、自分で識別子と mutex の対応付けを管理する
247 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 19:33:13 ] >>246 ありがとう。
248 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:15:18 ] 自分でご質問とか言うなよ
249 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:29:36 ] なぜ?
250 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:40:30 ] 自分がする質問だから 「あなたのご質問には答えられません」 なら、相手を持ち上げている 「私のご質問に答えてください」 なら、自分を持ち上げている 日本人として変であることに気づくべき
251 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:42:00 ] あほか 美化語を知らんのか
252 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:47:44 ] おトイレならわかるがご質問はないな。 「ご質問はありますか」は当然あり。
253 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:50:16 ] 尊敬と謙譲の概念しか無いようだな。
254 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:51:34 ] 板違い よそでやれ
255 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:52:09 ] 使い方が間違っているんだよ。 それを気づくことができないのか?
256 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:54:16 ] >>255 >>254
257 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 21:57:17 ] >>254 いやいや、質問する上でのマナーの話だからここで良い マナーを守れない方がどっか行くべき
258 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:00:35 ] >>257 いやいや、ご質問する上でのマナーのお話だからここで良い おマナーをお守りできない方がどっかへ行くべき
259 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:36:01 ] いや、マナーってほどの話ではないとおもう 変な日本語を使ってるけど、意味は理解できるから問題ない てなわけで、おスレち
260 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:41:30 ] やっぱ誰でもアクセスできるローレベルな話のほうが伸びるなw
261 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:42:45 ] すまんなw おれも、なんか参加しちゃってるよw
262 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:44:37 ] しょうがねーな 俺も参加してやろうか
263 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:46:22 ] 僕もご参加していいですか?
264 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 23:25:29 ] どうぞ、ご参加ください。
265 名前:デフォルトの名無しさん [2007/10/23(火) 23:36:57 ] 珍しく盛り上がってると思ったら・・・ >>244 コード例
266 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 01:46:21 ] ひさびさに来ましたよー 相変わらずスレ違いにはレス多いね。
267 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 01:59:52 ] スレッドの呼び出しコストってどうやってはかるの? 組込み用でmutexとかの関数の呼び出しコスト一覧 表作り単位んだけどどうしたらいいん?
268 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:27:13 ] >スレッドの呼び出しコスト 具体的にどういう意味と受け取ったらよいのだ?
269 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:38:38 ] 適当なタイマーで挟んではかr
270 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 08:11:41 ] >>265 ttp://developers.sun.com/solaris/articles/stl-new.html Standard Library, STL and Thread Safety Atomic updates for reference counting ttp://www.sparc.com/standards/SPARCV9.pdf J Programming With the Memory Modelsにいろいろ J.6 Spin Locks(Example 8―Lock and Unlock Using CAS) J.11 Fetch_and_Add(Example 15―Fetch and Add Using CAS) J.12 Barrier Synchronization(Example 17―Barrier Synchronization Using CAS) J.13 Linked List Insertion and Deletion(Example 18―List Insertion and Removal)
271 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:27:41 ] >>270 ktkr
272 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 08:14:03 ] C++でのマルチスレッドに関する質問です class sample{ private: int i; HANDLE hEvent; public: sample(){ hEvent = CreateEvent(NULL, TRUE, TRUE, L"sample"); } ~sample(){ CloseHandle(hEvent); } void fSetdate(int _i){ WaitForSingleObject(hEvent, INFINITE); ResetEvent(hEvent);//ロック開始 this->i = _i; SetEvent(hEvent);//ロック解除 } int fGetdate(){ WaitForSingleObject(hEvent, INFINITE); ResetEvent(hEvent);//ロック開始 int _i = this->i; SetEvent(hEvent);//ロック解除 return _i; } }
273 名前:272の続き mailto:sage [2007/10/25(木) 08:17:17 ] 上記のクラスをひとつだけインスタンス化して、 複数のスレッドがそれを呼び出した場合、データの同期化は成立しますか?
274 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 09:08:53 ] 何が死体のこれ?
275 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 09:18:17 ] 別々のスレッドがfSetdateのResetEventに同時に到達した場合どうすんの?