1 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 11:23:05 ] マルチスレッドプログラミングについて語るスレ。 OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/test/read.cgi/tech/997345868/ その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/
313 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 13:17:51 ] >>284 漏れも>308の言うとおりだと思う。 つか、めっちゃ単純な問題だと思ってたから まさかconsumerBとproducerBが別だと思ってなかったw あらためてソース見直してみてビックリした。 > ですから現在はA-B間、B-C間、C-D間のみで同期がされてます。 それでいいんじゃないの?他に同期取らなきゃいけないの?セマフォもいらんと思うけど。
314 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 13:30:26 ] >>313 > 他に同期取らなきゃいけないの? 知りもしないのに、 > セマフォもいらんと思うけど。 云うな(w
315 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 13:43:39 ] うん、ごめん。よくわかってなかったわ。 最初ConveyerBeltの作り疑ってたもんな。 危うく恥かくとこだった。
316 名前:289 mailto:sage [2006/02/12(日) 13:51:11 ] 俺も、>>308 に同意。 だから、 > 今度はB自身が消費したことをB自身に知らせなくては > ならなくて は、何か勘違いしてんじゃないかと思って、>>289 を書 いてる。はじめのうちは、(俺も含めて) 結構とんでもな い勘違いをすることがあるから、別にそれがおかしいとは 思わないけど、何を考えてるかわからんと情報を提供して あげることもできないから。 あと、>>306-307 が本人かどうか知らんけど、「真剣に 質問」したのにまともな答えが返ってこないと言うが、 匿名掲示板に質問すること自体が既に「真剣に質問」して いるとは言えない。回答する方は、あくまでも知ったかし たいか暇つぶしか昔の恩を返したいかなんだから、「真剣 に向き合え」とか言われたら、「なんちゃ、それ。」で無 視されるのがオチ。 この板の人は基本的に親切だから、嘘は余り書いてない。 >>290 みたいな雑音を飛ばしてよく読めば、きちんと ヒントは書かれているから、自分でググルなりすればいい。 そのものズバリの答えが欲しいなら、本を買うなり学校に 通え。
317 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 14:14:03 ] 実質何も答えていないのを繰り返してるだけじゃね?
318 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 14:19:02 ] 答える側が堂々巡りするケースのほとんどは、 質問がいい加減なことに起因する。
319 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 15:40:49 ]
320 名前:289 mailto:sage [2006/02/12(日) 15:47:02 ] >>317 まあ、確かにそのものズバリの回答は無いけど、>>287 , >>308 あたりは、充分ヒントになりうると思うが。 個人的見解として、このヒントを基に自分で勉強するぐら いでないとマルチスレッドのプログラミングはできないと 思う。
321 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:56:19 ] 変なところで改行するなよ 醜い
322 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 13:30:16 ] 久し振りに来てみたが、相変わらず、このスレは知ったか馬鹿が多いな。 とりあえず>>288 、>>310 、>>311 あたりの馬鹿どもはこのスレいても邪魔だから消えろ。 もう>>284 はいないと思うが俺なら public class Main { public static void main(String args[]) { ConveyerBelt NULL = new ConveyerBelt(); ConveyerBelt stationAB = new ConveyerBelt(); ConveyerBelt stationBC = new ConveyerBelt(); ConveyerBelt stationCD = new ConveyerBelt(); Worker workerA = new Worker(NULL, stationAB); Worker workerB = new Worker(stationAB, stationBC); Worker workerC = new Worker(stationBC, stationCD); Worker workerD = new Worker(stationCD, NULL); workerA.start(); workerB.start(); workerC.start(); workerD.start(); } } とやる。ConveyerBeltクラスん中ではinとoutの二つのbufferを作ってやれ。
323 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 23:01:34 ] >>322 > ConveyerBelt NULL = new ConveyerBelt(); > ConveyerBeltクラスん中ではinとoutの二つのbufferを作ってやれ。 馬鹿ジャネーの。
324 名前:デフォルトの名無しさん [2006/02/15(水) 00:03:38 ] >>323 自分の事を良く解ってるじゃないかw
325 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 00:15:31 ] 俺も > ConveyerBeltクラスん中ではinとoutの二つのbufferを作ってやれ。 は意味わかんねえ。ConveyerBeltなのに何か処理でもするの?
326 名前:釣りだったのかも...。 mailto:sage [2006/02/15(水) 01:13:37 ] >>325 多分、in と out の buffer を取り持つ ConveyerBeltSub を作るんだよ。 もちろん、その中には buffer が二ついるから、更に ConveyerBeltSubSub を作って...。(w # >>322 = >>324 は、基礎から勉強しなおした方がいいぞ。
327 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 01:48:57 ] buffer1個でいいでしょ
328 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 03:43:24 ] どうでもいいけどなんで4つとも別スレッドで独立して動かす必要がるわけ? 全体としてどんなことをしたいのか今一想像がつかん。
329 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 15:13:36 ] あらあら、もう一人馬鹿↑が来た お前、流れ作業って言葉聞いたことあるか?
330 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 15:20:00 ] >Aが物を作るとBに渡し、Bが物を作るとCに渡し、Cが物を作るとDに渡す、というように >複数の生産者/消費者のベルトコンベヤーでの流れ作業を想定しています。 >>327 お前の読解力は小学生以下か? buffer一つで出来るもんならやってみろ、馬鹿。 出来ないんならもう来るなよ、ここではお前は邪魔なだけだから。
331 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 16:06:16 ] パイプ1個あたりバッファ1個の意味で言った 言葉足らずというか全然意味が通らないねスマソ
332 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 18:06:14 ] Java よく知らんのだが、これは要するに 4つのスレッドを3つのキューで繋ぎたい、って「だけ」の話?
333 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 18:34:54 ] YES
334 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 21:04:57 ] >>329 いやそうじゃなくてどんな処理で4スレッドの流れ作業なんて必要になるのか 想像がつかんのだ。
335 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 23:29:55 ] マルチ商法ですた
336 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 23:46:26 ] そんなもの想像つかなくていい。 質問に答えりゃそれでいいんだ
337 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 01:22:58 ] 関連する複数のタスクを回す場合は、個別に分けずに スレッドプールでまとめてやるのがいいんじゃないの? やろうと思えばExecuterServiceでも似たようなのできるけど。 □ タスク側 1. 自身のタスク終わったら次のCallableをsubmit()する。 2. 途中のタスクの戻り値としては次のFutureを返す。 3. 最後のタスクは流れ作業全体の値を返す □ 呼び出し側 1. ExecuterServiceに最初のCallableをsubmit()する。 2. Futureのget()がFutureを返した場合は置き換えてループする。 3. Future以外が返って来たら全タスク完了。 ただ、Callable中で次のタスクをsubmit()すると、バウンド形式なQueueで 最大スレッド数に制限が付いてるとデッドロックの可能性があると思われ。 これはExecuterServiceを流れ作業の数だけ作れば回避できそうかな?
338 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 01:58:33 ] >>333 d楠。 たったそれだけの事で、こんだけ盛り上がれるなんて なんの病気なんだ… >>334 それを実現する手段を知るためじゃね?演習問題みたいな。
339 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 09:57:05 ] >>332 たぶんそう。それなのにbuffer二つとか言い出す奴もいて… そもそも質問があれだし。
340 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 12:51:20 ] みんなコロンブスの卵って知ってる? 「コロンブスの卵」は、「誰にできることでも、最初にするのが難しい」という意味で使われる。 1492年にアメリカ大陸(西インド諸島のサンサルバドル島といわれている)を発見したことで有名なコロンブス。 その功績を祝う晩餐会で、ある男が言った「西へ西へと航海して陸地に出会っただけではないか」と言った皮肉に 対して、コロンブスは卵を取り上げ、「この卵を卓の上に立ててごらんなさい」と言った だれも立てられないのを確認するとコロンブスは、卵のおしり(気室のある鈍端部と思われる)を食卓でコツンとた たいて立てて言った。「人がした後では何事も簡単です」 >>332 で、その「だけ」の話を理解できなかったのはどこの馬鹿だったっけ?( ´,_ゝ`)プッ
341 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 13:03:35 ] なにこの馬鹿…
342 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 13:13:45 ] ああ!この↑馬鹿か、その「だけ」の話を理解できなかったのは!
343 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 00:44:40 ] 文章から頭の悪さが滲み出ている。
344 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 12:29:01 ] ↑「だけ」の話を理解できなかったのが相当悔しかったんだね。( ´,_ゝ`)プッ
345 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 16:24:11 ] なんか雰囲気が悪くなってきたな。 元に戻そうぜ。 これって Aの生産量≦Bの生産量≦Cの生産量 だよね?でないとCとかDとかが結構待たされるんじゃないのかなーと。
346 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 21:50:29 ] ↑何もわかってない奴の典型だな!
347 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 22:38:57 ] と、必死。
348 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 23:57:11 ] 荒している馬鹿は、>>322 の阿呆レスした奴?
349 名前:デフォルトの名無しさん mailto:sage [2006/02/19(日) 03:12:23 ] ここにいるのは馬鹿ばっかだな
350 名前:デフォルトの名無しさん mailto:sage [2006/02/19(日) 03:15:52 ] >>345 ふいんき(←なぜか変換できない)戻そうと必死なのは分かるが 流れ作業なので Aの生産量=Bの生産量=Cの生産量
351 名前:332=338 mailto:sage [2006/02/19(日) 03:40:54 ] 荒らしの相手はやめようや。 >>334 今思い出したが、以前C++ on Windowsで似たような構成にしたことあったわ。 その時は通信スレッド×20→データベーススレッド×2→印刷スレッド×1だったが キューとミューテックス(各1)で小さいクラス作ったような覚えが。
352 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 04:08:06 ] >>350 なんで? 極端な話、Aが2つの整数を流してBがそのxorを流したら半分じゃん。 まぁ別にそんなのはどうでも良くて、 単に4つスレッドを作らなくちゃいけない状況を想像して見たかっただけ。 邪魔してすまん。
353 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 21:16:12 ] 10メガくらいのメモリをコピー(memcpyとか)するときに、 領域を分割してマルチスレッドにしたら速度上がる? マルチコアとかマルチスレッディングなら上がるかな?
354 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 22:57:06 ] memcpy()だったら変わらない希ガス fread()とかで、あるスレッドでHDDからデータ読み込み中に、 前回読み込んだデータ解析を行うとかだったらスループットはあがると思う。
355 名前:デフォルトの名無しさん mailto:sage [2006/02/21(火) 11:30:13 ] >>353 CPUが速ければ、 キャッシュを含めたバスシステムがボトルネックになるまでは上がる。 システム依存だから自分のターゲットにしているヤツで試してみて。
356 名前:353 mailto:sage [2006/02/22(水) 08:10:39 ] ありがとう。 でも本当はそんなメモリコピーしない設計にするのがいいんだよなorz
357 名前:デフォルトの名無しさん mailto:sage [2006/02/22(水) 21:31:45 ] じゃあ、なんでそんな設計にならざるを得なかったのか、説明してみればいいじゃない。 メモリ参照だけで済むアルゴリズムを誰かが教えてくれるんじゃない?
358 名前:デフォルトの名無しさん mailto:sage [2006/02/22(水) 22:06:40 ] writeで例外起こすようにしてcopy-on-writeだ
359 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 02:58:53 ] 設計したのは赤の他人。 ワタシはメンテ担当(涙)
360 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 17:25:34 ] >>359 その赤の他人よりも上手に設計できたとおもう?
361 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 00:01:14 ] 何このウスラ馬鹿な突っ込み
362 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 01:05:49 ] >>359 設計思想もわからん個所を、色々チューニングしようとしてるの? 悪いことは言わないから「やめとき」。
363 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 01:08:10 ] 仕事じゃしょうがないよな。
364 名前:デフォルトの名無しさん [2006/03/03(金) 07:10:31 ] UNIXでC++なんですが、ttp://d.hatena.ne.jp/yupo5656/20041011/p3 ここに載っている、 スレッドローカルストレージを使ったシングルトンの実装って安全でしょうか? だいたいこんな感じになってます。 public: static T& getInstance(void) { static __thread T* tsd_instance = 0; if (!tsd_instance) { tsd_instance = getInstance_(); } return *tsd_instance; } private: static T* getInstance_(void) { boost::mutex::scoped_lock lk(m); if (!instance) { instance = new T; } return instance; }
365 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 12:00:38 ] ISO C++の範囲内でポータブルな実装はないんだ。 >>291 を読め。
366 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 23:44:47 ] >>364 安全ですよ。 getInstance_(void) が既に安全なわけで、 tsd_instance の方は覚えとくだけで、 かつ単一スレッドからしか参照されないので。 メモリモデルの問題については、 たぶんscoped_lock の解放でメモリバリアも処理されるんでしょう。 (pthread のドキュメント呼んでないのであてずっぽう)
367 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 22:28:46 ] >365 364はDCL関係ないじゃん
368 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 22:52:17 ] >>366 POSIXではmutexの開放はメモリバリア。
369 名前:デフォルトの名無しさん [2006/03/05(日) 00:20:02 ] >>364 例の www.nwcpp.org/Downloads/2004/DCLP_notes.pdf の最後のほうに > Replace global singletons with per-thread singletons: > - Each can use thread-local storage. > -- Threading concerns during initialization thus vanish. > - But now there are multiple "singletons." と書いてあって、TLSを364のようには使ってないのが気になります。 一方、 www.cs.umd.edu/~pugh/java/memoryModel/archive/0670.html でDoug Leaさんが364方式のTLSの使い方に文句を言っていない(条件 付きながら)ので大丈夫な気もします。まぁ、かなり昔のML投稿ですけど ね・・。 さて真相は?
370 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 16:07:01 ] >>340 普通の卵は比較的簡単に立つよな。表面に凹凸があるから。産みたてほど立ち易い。 ・・・コロンブスは卵をツルツルに磨き上げていたに違いない。
371 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 17:35:06 ] >>370 まあまあ。 コロンブスもギャグで言っただけなんだから許してやってくれ。
372 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 19:33:03 ] 後世の作り話ですから。 まあ>>340 は底抜けの馬鹿だけど。
373 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 14:35:11 ] ゆで卵にして高速で回せば立つよ。 まあ>>372 は底抜けの馬鹿だけど。
374 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 14:57:53 ] 盛り上がっているところ、横から突っ込んでスマンけど。 生卵を立てるには塩をごく少量盛って、その上に立てて、横から 息をゆっくり吹きかけて塩を飛ばすといいという話を聞いた。 とかいう本当にどうでもいい話をマルチスレッドスレでする 自分は底抜けの馬鹿ですw
375 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 19:27:05 ] つまり塩スレッドに卵スレッドをロックさせれば桶?
376 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 10:03:12 ] 卵スレッド発見
377 名前:デフォルトの名無しさん [2006/03/08(水) 20:55:31 ] つまらんよ >>369-376
378 名前:デフォルトの名無しさん mailto:age [2006/03/08(水) 21:34:40 ] 君ほどでも
379 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 23:26:59 ] ゆで卵の殻を剥かずに塩をかけるなんて、底ぬけの馬鹿ですね
380 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 03:03:29 ] 観光地のゆで卵は全部そうなってるよ
381 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 03:09:09 ] >>379 卵殻はNa+イオンもCl-イオンも透過するのでちゃんと卵に塩味がつきます。 溶けさえすれば。
382 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 15:12:11 ] ※注意: このスレはこの卵ネタで1000まで引っ張る覚悟です
383 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 15:22:01 ] たまごが立つという状態を定義してください。
384 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 16:21:34 ] ブスの卵
385 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 17:20:48 ] >>383 案1: 水平方向の任意の角度から卵を投影したときに、水平方向のスパンよりも鉛直方向のスパンの方が長い状態。 ただし卵が他の物体と接することができるのは下部のごくせまい部分のみとする(←うまい定義できないなこれ)
386 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 20:48:52 ] ポテンシャルの極大点。
387 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 21:13:15 ] あ、あんたなんかにたたれてもうれしくないんだからねっ!
388 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 00:28:56 ] >>383 おまいはコンピュータか? んなもん定義しないでも分かるだろ
389 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 03:03:47 ] クララが立った、と言う状態を定義してください。
390 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 03:04:39 ] 精神的な自立
391 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 03:21:15 ] それで泣ける、という状態を定義してください。
392 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 08:40:40 ] クララが勃った、と言う状態を定義してください。
393 名前:デフォルトの名無しさん mailto:sage [2006/03/11(土) 18:55:33 ] クララが勃った クララは女である ∴よって勃ったのは乳首である
394 名前:デフォルトの名無しさん mailto:sage [2006/03/11(土) 19:03:44 ] class clitoris extends electiliable {
395 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 11:42:52 ] >>394 なんだ、選挙にでも出るんか? …それを言うならerectibleだろ。
396 名前:デフォルトの名無しさん [2006/03/12(日) 16:25:47 ] Win32 Administrator権限で実行されてるプロセスからスレッドを起こすとき、 スレッドそれぞれに異なるユーザー権限を設定することは可能? プロセスごとならできるんだが。もし可能ならAPI名などヒントを頼む。
397 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 16:54:30 ] インパーソネーションとかいうんだっけ? ImpersonateLoggedOnUserとか。 まー、RevertToSelfとか呼ばれると、元に戻るけどね。
398 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 21:06:38 ] >>397 ありがd。 まだ試せてないが、MSDNの説明から目的に適うAPIのよう。
399 名前:デフォルトの名無しさん mailto:sage [2006/03/15(水) 14:41:37 ] なぁなぁ、 class Job extends Thread { public void run() {} } class MyJob extends Job { public void run() {} } ってあったらMyJobのrun()がJobのrun()をオーバーライドするんで Jobのrun()に書いてある定義とか全部無視されちゃうよね? ちゅーか、Jobのrun()の一行目に System.out.println("Hello? Hello? Can you read me?");//never displayed と書いても表示されないから間違いない。 でも、どうやったら両方のrun()とも動かすこと出来るんだろ?
400 名前:デフォルトの名無しさん [2006/03/15(水) 14:42:42 ] 一応ageとく。
401 名前:デフォルトの名無しさん mailto:sage [2006/03/15(水) 14:54:45 ] >>399 1つのスレッドで順番に動かしたいのか? MyJob.run() と Job.run() を別のスレッドで動かしたいのか? MyJob と Job のインスタンスをそれぞれ作ったらいけないのか?
402 名前:デフォルトの名無しさん [2006/03/15(水) 15:48:21 ] >>401 ありがと。 二番目の「別のスレッドで動かしたい」かな。 run()直接アクセスするとあかんのよね、.startで始めないと? どうしようかな?
403 名前:デフォルトの名無しさん mailto:sage [2006/03/15(水) 16:35:55 ] >>402 その手法が可能かどうかの前に、やろうとしていることに対して もっと単純な方法や、別の解法が無いか検討したらいいんじゃ ないかな。 ちょっと言語(Java?)の使い方から外れているみたいので、 本当にやりたいことが妥当かどうか見極めた方がいいと思う。
404 名前:デフォルトの名無しさん mailto:sage [2006/03/15(水) 22:37:56 ] >>399 super.run();
405 名前:デフォルトの名無しさん [2006/03/16(木) 09:59:17 ] >>403 確かにそうだったかもしれん。ありがと。 >>404 いや、直接run()にアクセスするのは禁(ry
406 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 14:36:26 ] Linux 2.4.31-0vl1.8smp + glibc-2.3.3-3vl1.3 pthread (linuxthread) プログラムでたまーに(でも確実に) seg fault してしまいます。 該当箇所は pthread_mutex_unlock(&mutex_sleep); という処理で、mutex_sleep はグローバル。core dump に聞いてみたらこんな返事が。 Program terminated with signal 11, Segmentation fault. #0 0x080551c7 in __pthread_alt_unlock (lock=0x80cb548) at spinlock.c:600 } else if ((prio = p_node->thr->p_priority) >= maxprio) { (gdb) bt #0 0x080551c7 in __pthread_alt_unlock (lock=0x80cb548) at spinlock.c:600 #1 0x08051fc9 in __pthread_mutex_unlock (mutex=0x80cb538) at mutex.c:199 #2 0x0804e3cc in send_proc (arg=0xc) at send_proc.c:112 #3 0x08051709 in pthread_start_thread (arg=0xbdbffbe0) at manager.c:309 何か情報ありますか?
407 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 20:44:16 ] mutexがすでに死んでるとか?
408 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 22:30:14 ] Windows Threadについて質問です。擬似コードですが、 Thread[] threads = getAllThread(); foreach (Thread t; threads) { t.suspend(); } このような全てのスレッドを止めるためのループがあるとします。 このループ中では、既に止められているスレッドと、 これから止められる予定のスレッドがあると思うのですが、 これから止められる予定スレッドが、既に止めたスレッドを再開(resume)するため、 このループでは全てのスレッドを止められない、ということは起こりえるのでしょうか?
409 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 22:36:16 ] >>408 起こりうるでしょうね。 避けたいのならばまず自分の優先順位をトテモ高くして、 その後ループに入れば良いと思います。 先方のスレッドも優先順位を上げている恐れがあるのならば 完全ではありませんが。
410 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 22:36:36 ] 知らね。 だって、普通そんな造りにしないもん。 普通は、終了しろ、っていう合図を各スレッドに送って 自主的に終了なり中断なりするのを待つだけだから。
411 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 22:37:03 ] 起こりえる。 おまけにこれから止めようとするスレッドが新たにスレッドを作るかもしれない。 全スレッドで、「スレッドマネージ用ミューテックス」などを使用すればいいんでない?
412 名前:デフォルトの名無しさん mailto:sage [2006/03/16(木) 22:39:04 ] 他のスレッドを suspend するってのはまず間違いなく設計ミス。 C のランタイムとか Windows に用意されているいろんな dll の 内部まで良く知っていて、何か大事なものの所有権を持ったまま suspend されちゃったりすることはないと確信を持っているなら 別だけど。
413 名前:408 mailto:sage [2006/03/16(木) 22:46:12 ] どうも。 実は、これのpause版とresume版がD言語の標準ライブラリの中にあって、 GCを呼ぶ前にそれでスレッド止めて、後に再開ようとしているみたいなのですけど、 それのへんでアプリケーション側で実装しているスレッドの同期が変になるみたいです。 安心できませんが、安心しました。