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/
445 名前:デフォルトの名無しさん mailto:sage [2006/05/07(日) 04:53:31 ] シュレディンガーが猫を題材にしたのと通じるものがあるな
446 名前:デフォルトの名無しさん mailto:sage [2006/05/07(日) 09:56:09 ] お前なーやめろよ 話の流れから シュレディンガーが猫を食材にしたのと通じるものがあるな と読んじゃったじゃないか まぁ、たいして違いはないが
447 名前:デフォルトの名無しさん mailto:sage [2006/05/07(日) 13:34:52 ] 哲学者よ、明日はパスタにしよう。うん、パスタ。
448 名前:デフォルトの名無しさん mailto:sage [2006/05/07(日) 21:18:36 ] 哲学者は手掴みで食べないものなのですか?
449 名前:デフォルトの名無しさん mailto:sage [2006/05/07(日) 21:22:19 ] 哲学者はそんなはしたないまねはしません。 しかし決して人に譲ることもしません。
450 名前:デフォルトの名無しさん [2006/05/08(月) 00:23:38 ] 哲学者よデスマーチから逃げれ!!
451 名前:デフォルトの名無しさん [2006/05/08(月) 09:39:33 ] age
452 名前:デフォルトの名無しさん mailto:sage [2006/05/09(火) 20:31:01 ] Cでスレッド固有のグローバル変数みたいなものって使えないかな ほぼ全ての関数でスレッドごとに値の違う変数使ってるんで 毎回引数に加えるのが面倒になってきた
453 名前:デフォルトの名無しさん mailto:sage [2006/05/09(火) 20:48:51 ] 処理系固有でTLSなどがあるとは思うが。
454 名前:デフォルトの名無しさん mailto:sage [2006/05/09(火) 22:34:47 ] >>453 サンクス。しらんかった
455 名前:デフォルトの名無しさん mailto:sage [2006/05/10(水) 00:58:57 ] gccだと、 __thread int i; とか。
456 名前:デフォルトの名無しさん mailto:sage [2006/05/10(水) 01:26:42 ] 調べました pthreadだとpthread_key_create()とかですね __threadの方が扱いやすいけどポータビリティとしてはどうなんだろう gcc依存でも別に困りはしないんですけどw 何はともあれありがとうございました〜
457 名前:デフォルトの名無しさん mailto:sage [2006/05/10(水) 08:23:30 ] ポータビリティが気になるなら APR とか使うのは? apr.apache.org/docs/apr/group__apr__thread__proc.html#ga23
458 名前:デフォルトの名無しさん mailto:sage [2006/05/14(日) 15:00:46 ] 結城浩のデザインパターン スレッド編って買い?
459 名前:デフォルトの名無しさん mailto:sage [2006/05/16(火) 12:59:06 ] . -‐- . __ 〃 ヽ : :ヽ\ ノノノ)ヘ)、!〉 : '. l(0_)!。-‐ ‐〈リ .はわわ〜マルチが459ゲットですぅ… ;Vレリ、" (フ/ ; : l´ヾF'Fl : ∧__∧____ ;. 〉、_,ノ,ノ : /|・∀・ ┥ ./\ . /ゝ/´, ヽヽ . . /| ̄∪∪ ̄ ̄|\/ : く/l |_ノト‐'⌒),) . | 拾って |/
460 名前:デフォルトの名無しさん [2006/05/20(土) 17:07:49 ] >>458 買い。
461 名前:デフォルトの名無しさん [2006/05/22(月) 00:45:49 ] longの読み書きについて質問失礼します。 @マルチスレッドで InterlockedExchange を使用し、longの値を変更しています。 A別スレッドで@で変更しているlong値を参照しています。 (読むだけの Interlocked〜 の関数が見当たらない為) この処理って大丈夫なんでしょうか? 実際にソースに組み込んでテストしているのですが、今の所大丈夫っぽいです。。。
462 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 01:19:41 ] volatile修飾すれば大丈夫という噂
463 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 01:25:57 ] 共有リソースを元に、あるメモリに書き込みとかをしなければ問題ないよ。 参照だけなら、何の問題もなし。
464 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 03:01:15 ] Interlocked.Read
465 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 03:01:52 ] てv1か… Interlocked.Readは2からだったな…
466 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 06:15:08 ] >>461 InterlockedExchangeAdd
467 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 16:38:37 ] Pentium XE 840 ではHyper-Threading有効となっているので、 デュアルコア×2スレッドで4スレッド同時処理ができますが、 HTの論理コアを判別する方法はないでしょうか? SetThreadAffinityMask() を利用して1つのコアを スレッドに対して独占的に割り当てた場合にHT論理コアだと 処理速度向上が余り望めません。 もしくはWindowsでCPU番号(コア番号)が どのように割り当てられるかご存知ないですか? 単純に↓とか? CPU1-Core1-Main CPU1-Core1-HT CPU1-Core2-Main CPU1-Core2-HT Opteron だと? CPU1-Core1 CPU1-Core2 CPU2-Core1 CPU2-Core2
468 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 18:35:25 ] >>467 何か勘違いしてないか?
469 名前:デフォルトの名無しさん mailto:sage [2006/05/23(火) 22:13:13 ] >>468 何か勘違いしてないか?
470 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 02:28:01 ] >>467 それはOSの仕事
471 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 09:01:15 ] SetThreadAffinityMask(hThread,0x01); SetThreadAffinityMask(hThread,0x02); SetThreadAffinityMask(hThread,0x04); SetThreadAffinityMask(hThread,0x08); とした時にどのコアが使用されるか知りたいってことじゃねーの?
472 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 11:26:01 ] >>467 www.intel.com/cd/ids/developer/asmo-na/eng/269421.htm SetThreadAffinityMaskでCPUにスレッドを固定した後、 当該スレッド APIC ID を入手して core id と SMT ID を入手すればよい。 用語が混乱してるようだけど、Coreっていうのはホントのcoreのことで、 コアの中で演算回路等を共有して独立したCPU風に振舞うのはlogical cpu とか SMT とか言う。 例えばDualCore でコアあたり2つのSMTをサポートするCPUの論理CPU構成は Core1-SMT1 / Core1-SMT2 / Core2-SMT1 / Core2-SMT2 だ、 とこんな風に言う。
473 名前:デフォルトの名無しさん mailto:あげます [2006/05/26(金) 12:26:42 ] CRITICAL_SECTIONを使う場合ローカルなstatic変数として使用してもよいのでしょうか? ↓のような関数をスレッド内で呼び出す場合です。(ここではcountに同時アクセスしないようにすることを目的とする) int hoge(int init, int del, int i) { static CRITICAL_SECTION cs; static int count; if(init) InitializeCriticalSection(&cs); if(!init && !del) { EnterCriticalSection(&cs); count += i; LeaveCriticalSection(&cs); } if(del) DeleteCriticalSection(&cs); return count; }
474 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 16:39:43 ] >>470 ヴァカ発見
475 名前:名無しさん mailto:sage [2006/05/26(金) 19:42:14 ] >473 関数のセマンティクスとしてはクソだが、特に問題は発生しないだろう。
476 名前:467 mailto:sage [2006/05/26(金) 20:21:43 ] >>472 なるほど…スレッドを固定してCPUIDでチェックすれば判別できそうですね。 用語解説は非常に勉強になりました。 ありがとうございますー 良く考えてみればSMT1が軽い負荷ならSMT2に重い負荷を かけても遅くならないのかな…? だとすると、同じコアのSMT1とSMT2に割り当てないようにすれば 効率が良さそうですね。
477 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 23:31:44 ] 時期尚早な最適化は諸悪の根源だ
478 名前:473 mailto:sage [2006/05/27(土) 00:41:46 ] >>475 どもです。
479 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 01:31:47 ] >>476 みんなpthreadのデバッグってどうやってやってますか? 1ソースコードから処理を推測してデバッグ 2とりあえずなんでもいいからprintf仕込んでデバッグ 3gdbを利用する 4ツールを使って調査する。 もしいいツールとか方法あれば教えてください。
480 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 11:05:19 ] >>479 つ【5 - pthreadの気持ちになってみる。】
481 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 12:17:16 ] >>479 pgdbgはどうよ? (というかプラットフォームは何よ?) Linuxは、IBMがpthreadを手がけた時に、 libpthdebug.aがAIXから持ち込まれるかと思ったが、 IBM版はlinuxサイドから拒絶されたので実現しなかった…
482 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 12:30:20 ] pgdbgですかぁ渋いですね それでいっちょ今から会社飛んでデバッグしてきますね
483 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 17:23:07 ] 基本的に知識足りてねぇって感じなんですが質問させてください。 boostのmutexとconditionでWindowsAPIのEventと同等機能をやろうと思ってやってたんですが boost::condition::notify_oneを呼ぶときもmutexでロックしないとまずいですか? これがデッドロックせずに動くってことは多分そういうものだとは思うのですが… boost::mutex g_mutex; boost::condition g_cond; void Wait() { boost::mutex::scoped_lock lk(g_mutex); g_cond.wait(lk); } void Notify() { boost::mutex::scoped_lock lk(g_mutex); // これって必要ですか? g_cond.notify_one(); }
484 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 23:06:05 ] それでええで。 examples/libs/thread/example/condition.cpp 見てみ。
485 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 23:06:55 ] examples/は余分やな…
486 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 23:20:41 ] だめだ、pthreadが周りでどうしても落ちる セグ落ちでどうしてもダメううーん発見できん 神様助けてくれ
487 名前:デフォルトの名無しさん mailto:sage [2006/05/28(日) 23:20:52 ] >>484 ありがとうございます、スッキリしました。
488 名前:デフォルトの名無しさん mailto:sage [2006/05/30(火) 18:30:41 ] >>486 落ち始める直前の状態にまで戻して何やったのか胸に手を当てて考えてみれ。
489 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 00:36:18 ] ふっふっふっふ私はもうスレッドは怖くない スレッドの挙動を完璧把握する方法を知ってしまった ふっふっふっふ
490 名前: mailto:sage [2006/06/01(木) 02:46:02 ] pthread_cond_timedwaitで、指定タイマーを経過しても待ち状態解除されず 停止したままになってしまっているのですが、引数パラメータに問題が あるのでしょうか。 gdbで確認したところ引数は問題なさげで、pthread_cond_timedwait内の pthread_sigsuspendで停止してるっぽいのですが…。
491 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 12:38:26 ] 糞カーネルを使っているに一票
492 名前:デフォルトの名無しさん mailto:sage [2006/06/07(水) 01:46:39 ] まずOSの種類とカーネルの素性晒せ
493 名前:デフォルトの名無しさん [2006/06/07(水) 08:46:05 ] LINUXですよ(^^)
494 名前:デフォルトの名無しさん mailto:sage [2006/06/08(木) 01:10:24 ] それは windows でない。とだけ言ってるに等しい
495 名前:デフォルトの名無しさん [2006/06/08(木) 13:42:04 ] マルチスレッドとマルチプロセスでは一般的にどちらが効率的ですか?
496 名前:デフォルトの名無しさん mailto:sage [2006/06/08(木) 18:36:22 ] タスク間のデータ参照が多いプログラムと少ないプログラムでは、どちらが「一般的」ですか?
497 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 01:47:28 ] volatileで回避できますか?
498 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 04:22:44 ] volatileとstaticで8割方回避できます!
499 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 08:47:58 ] なにをだ。
500 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 10:14:15 ] mutexとvolatileでは一般的にどちらが効率的ですか?
501 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 12:19:02 ] コーディング効率か コードの効率か で回答が変わってくる可能性がある
502 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 12:24:23 ] volatileはLockFreeで高速だが、アトミック操作に限定されるので、 一変数ならともかく、全体の整合性がどういう言い出すとプログラムは とっても面倒だし、バグがあるかないかの検証も面倒くさい
503 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 12:54:08 ] ( ゚д゚)ポカーン
504 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 14:14:06 ] >>501-502 がマジレスである可能性を想像し、背筋が凍った。
505 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 15:55:27 ] そのまま風邪引いて肺炎悪化させて死んでくれ
506 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 16:56:15 ] こんにちわ。誘導されてきました。 セマフォの扱い方について、よろしければ教えてください。 以下が環境です。 ・HP-UX & aCC ・共有メモリを使用し、その排他制御にセマフォを使用している ・共有メモリとセマフォは専用のクラスを作成して管理している ・上記資源は複数のプロセスで使用する ・上記管理クラスのインスタンスはプロセス内に複数存在する やりたいことは以下の通りです。 ・1つのプロセス内で、同じキー値を利用するセマフォの lock を ネストさせても2回目以降の lock で固まらないようにしたい ・unlock はネスト中の実際に lock した箇所に対応したところで 実行するようにしたい void a() { void b() { CSemafore sem1; CSemafore sem2; sem1.lock(); sem2.lock(); ←ここで固まらないようにしたい b(); sem2.unlock(); sem1.unlock(); ←ここで解除したい } } セマフォのクラスインスタンスが1つの場合は lock の回数を数えるカウンタを 用意することで解決できそうなのですが、複数の(同じキー値を利用する)インスタンスが 絡んできた場合に、上手に処理する方法が思い浮かびません。 こういったことは可能なのでしょうか。ご教示頂けると嬉しく思います。 よろしくお願いいたします。
507 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:01:47 ] trylockしてみて無理だったら待てばいいんじゃねぇの? 違うってかゴメンね
508 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:27:39 ] >>506 どういうデッドロックを想定しているの? th1がaをlockしてbを得ようとして、th2がbをlockしてbを得ようとしているとか? 入れ子セマフォア 多重セマファオ で解決できませんか?
509 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:47:33 ] >>508 >入れ子セマフォア >多重セマファオ おチツ毛
510 名前:506 mailto:sage [2006/06/10(土) 19:05:08 ] >>507 ご返信ありがとうございます。 trylock とは「lock が可能な状態であれば lock を実行し、そうでなければなにもしないで 終了する」処理との理解で正しいでしょうか。trylock が失敗した場合の処理を実装できれば よいのですが、出来るだけ単純化したいと考えており、今回の件では少し辛いです。すみません。 >>508 ご返信ありがとうございます。 知識が足りず「入れ子セマフォ」「多重セマフォ」の言葉が分かりません。 検索も試したのですが... すみません。 今回はスレッドを使用していないので基本的にはプロセス単位で考えています。 目的としては同一プロセス(スレッド)による lock でデッドロックを発生させないように する方法を探しています。ご例示頂いた異なるスレッドによるデッドロックは‥‥実際にやって いたのですがw、プログラムを直してうまく動くようになりました。 先の投稿に記述した「やりたいこと」について考えていたのですが、以下のようにすれば 出来そうに思えてきました。 ・2つめの unlock 位置の判定の件は「カウンタ」の管理で解決できそう (もっと良い方法があるようでしたらご教示頂けると嬉しいです) ・1つめのネスト時のデッドロック防止については、セマフォのキー値毎に最後に lock を 掛けたプロセス(スレッド)を識別出来るようにして、それが自プロセス(スレッド)で ない場合だけ lock 処理を実施する 上記の「最後に lock を掛けた(sembuf.sem_op を 0 にした)プロセス(スレッド)を識別する」 方法はあるのでしょうか。お知恵を拝借できれば幸いです。 >>509 少しウケました。そのノリは高校の時以来です。w
511 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 19:54:30 ] >>510 ttp://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%9E%E3%83%95%E3%82%A9 古典的って言ったら古典的か.
512 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 19:56:50 ] >>510 ロックの話だけで頭がいっぱいになってるけど そのsem1とsem2の間でどんな処理をするのか 教えてよ。
513 名前:506 mailto:sage [2006/06/10(土) 21:59:59 ] >>511 ご返信をありがとうございます。 これは「多重セマフォ」の解説(使用例の項)でしょうか? 残念ですが、今回の件は同時参照を全て止める必要があるため、初期値を大きくすることに よって解決とすることは出来ないと思います。情報をありがとうございました。 >>512 ご返信をありがとうございます。 不要と判断していました。たとえばですが。 共有メモリにある情報をまとめたテーブルがあるとします。 関数 SetData01() はこのテーブルの特定のデータを変更します。 同様に SetData02() など複数の関数があり、それぞれ関数内部でデータを変更するための (受取手にとってわかりやすい形から格納に適した形への変換などの)処理を実施しています。 これら関数には対応する GetData**() も存在し、変更/参照時には共に排他制御(sem2)を実施します。 更に上記個別の値をまとめて取り扱う関数として SetGroupData() なる関数があり、 先の個別にデータを変更/参照する関数を内部で使用します。 この関数でのデータの変更時には、関連する全てのデータ更新が終了するまではデータ間での 矛盾発生を防ぐために他からのデータ参照を止めたい場合があるため、この関数の実行時にも 排他(sem1)を掛けたいと考えています。 回避策として、SetGroupData() で SetData01() などを呼ばずに自前で個別データの 設定を行う方法もあるのですが、少々煩雑な処理をするところもあるため、可能であれば SetData01() などを利用する形に出来ればと思っています。 そのままのことは書けないため、説明が足りないところもあるかと思いますがご容赦ください。
514 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 23:56:28 ] >>513 そのよくわからんけど、SetDataなんちゃらっていうメソッドをいくつも用意するの? そんなことするよりもさ SetData(class data)を用意してこいつが責任もって共有データを単独で更新すればいいんじゃないのか? じゃあ、みんなで同時に呼べねーべバーカとか思うなら、このSetDataは要求をスタックに貯めて逐次実行する 仕組みだけを排他制御で実装すればいいよね。共有メモリに置く程度のデータならそれぐらいで間に合わないかな?
515 名前:506 mailto:sage [2006/06/11(日) 15:27:03 ] >>514 ご返信、ありがとうございます。 初めからそういう方向性を考えていれば...と後悔しているところです。(汗 次こそわ。
516 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 20:23:12 ] いや、変えないと今のも終わらないから。
517 名前:デフォルトの名無しさん [2006/06/12(月) 17:52:57 ] 質問です。 _beginThreadを使ってスレッドをつく、その中でゲームの描画をまわしているのですが void ThreadMain(void* pParam) { HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); DWORD dwLastTime = timeGetTime(); while(!pApp->m_bStopThread) { WaitForSingleObject(hEvent, 16 - __min(16, timeGetTime() - dwLastTime)); dwLastTime = timeGetTime(); //実際はここで描画をするけど、今は空. } CloseHandle(hEvent); _endthread(); } こんなことを行なうとタスクマネージャー上でCPUパワー使用率が100%近くになってしまいます。 (WaitForSingleObjectは、待機中CPUパワーを使わないとあったので期待したのですが) Sleepあたりを入れてみたりしても、Sleep(1000);くらい大きく指定しないと使用率0%付近になりません。 スレッドを使った場合、CPU使用率は高くなってしまうものなのでしょうか? 今まではスレッドを使わず、WinMainで処理をしていたのですが、そちらでは使用率が0%に近かったです。
518 名前:デフォルトの名無しさん [2006/06/12(月) 17:53:43 ] 今までスレッドをやらないパターンですとこんな感じでした。 CPU使用率は常に0%付近でした。 //WinMainに while(TRUE){ while(0 != PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){ if (!GetMessage(&msg, NULL, 0, 0)) return msg.wParam; TranslateMessage(&msg); DispatchMessage(&msg); } else if (16 <= timeGetTime() - dwLastTime){ dwLastTime = timeGetTime(); // 処理 } }
519 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 18:04:20 ] >>517 それ、WaitForSingleObject で待ってない(即リターンしてる)から。 他のスレッドが所有権を持ってないので、呼び出したスレッドが即座に所有権を得ておしまい。 2度目以降の呼び出しは、呼び出したスレッドがすでに所有権を持っているので即座に完了。 他のスレッドに所有権を持たせておくか、selectとかSleepでも使うべし。
520 名前:519 mailto:sage [2006/06/12(月) 19:39:57 ] 今思いついたんだけど、とにかくタイムアウトさせたいなら GetCurrentThread() で得たハンドルを wait してもいいのかもしれない。
521 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:45:59 ] >>519 アドバイスありがとうございます。 ただ、デバッガで追ってみましたところきちんと毎回Waitしている様子です。 Wait時間を分かりやすく5秒にしてみたところ、私の期待通りの動作をしているようです。 selectについてもこれから試してみたいと思います。
522 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:53:00 ] Sleep、WaitForSingleObject、いずれも、寝ている時間の精度自体は5msも保証できない
523 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:57:04 ] >>522 なんと、そうなのですか? やはりFPS60なんていう精度を望む場合 Waitなんて無しでぶんまわしつづけるしかないのでしょうか? (そもそも、Windowsで精密ゲームを作ること自体、Windowsの設計理念とは反している気がしますが)
524 名前:519 mailto:sage [2006/06/12(月) 20:25:43 ] >>521 そですか・・・ところでメインスレッド側は PeekMessage 無しに戻しましたか? 単純に >>518 から else 以降を取ってしまうと、CPU 100% のビジーループに なるわけですが。
525 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 21:08:55 ] ところで、なんで、NOREMOVEでPEEKしたあと、またGetMessage呼んでるの? 単純に、直接REMOVEでPEEKして、Translate,Dispatchすればいいと思うんだけど
526 名前:デフォルトの名無しさん [2006/06/13(火) 14:46:50 ] pthread_create() で作ったスレッドが終了したかどうかの確認は どうしたらいいんでしょうか? pthread_join() してしまうとその スレッドが終わるまで待たされてしまいますよね? やりたいことは、複数のスレッドを作って、作った側で pthread_t の配列にスレッド識別子を入れておき、それぞれがバラバラの 時間で終わるんですが、作った側で pthread_t の配列に入っている 値を元にそれぞれが終わったかどうかを確認して、終わっていたら それに対して pthread_join() をやって資源開放をて、配列の側も その部分を終了しているという値(たとえば0)にしたいんです。 (つまり UNIX で複数 fork() したあとで waitpid() の WNOHANG みたいにして何が終わったか、あるいは何も終わっていないのかを 確認するのと同じことです)。こういうのは pthread ではどうやる んでしょうか?
527 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 21:33:23 ] pthreadは詳しくないけど自分でフラグ作っても大して開発効率落ちないと思う。
528 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 00:10:40 ] SIG_CHLDシグナルで判断しろよ
529 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 12:15:21 ] >>528 pthread で作ったスレッドに対して SIGCHLD は使えないのでは? 子プロセスじゃないんだし。(Linux の実装だと使えるとか?)
530 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 13:11:53 ] POSIX P1003.1cにpthread_kill()ってのがあって、 signalを指定する引数に0を指定すると、 pthreadがいれば成功(シグナルは何も送られない)、 いなければESRCHのエラーになる。 processに対するkill(2)と同じ仕様。 > 自分でフラグ作っても大して開発効率落ちないと思う。 ではありますが。
531 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 13:23:26 ] >>530 あー! その手があったか。 くっそー。 pthread_kill() の man ページは見ていたのに気が付かなかった。 どうもありがとうございます。
532 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 17:46:23 ] スレッドのデバッグって何使ってますか? Linuxだとgdbだけかな?
533 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 00:32:10 ] 知恵と勇気
534 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 01:05:12 ] >>533 そんなのいらねーよ何か教えねーと食うぞ?
535 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 10:33:24 ] 「ちびくろ! おまえを たべちゃうぞ!」と、とらは いいました。
536 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 21:49:53 ] >>532 かん
537 名前:デフォルトの名無しさん mailto:sage [2006/06/20(火) 13:18:17 ] >>532 おれ、この前 gdb でやってみて大混乱。 使い方調べてから使わないといかんね。
538 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 17:19:02 ] 無茶しやがって…
539 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 21:26:39 ] Windowsで、タスク内の複数スレッド間だけで通用する、高速な同期オブジェクトって無いですかね? なんか、どれもこれも、重そうで。
540 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:41:41 ] イベント系はユーザーモードで実行される。 イベント系はプロセス間の動機にも使えるという強みがある。 クリティカルセクションのみカーネルモードで実行される。 クリティカルセクションはプロセス間の動機で使えないがイベント系に比べると 非常に高速だという強みがある
541 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:49:15 ] >>540 クリティカルセクションって何?
542 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:58:44 ] ミューテックスとほぼ同じ。 タイムアウト指定ができなかったりする。
543 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 00:07:28 ] カーネルモードに移行するものが高速で ユーザーモードのまま実行できるものの方が遅いって?
544 名前:539 mailto:sage [2006/06/25(日) 03:10:41 ] クリティカルセクションだと、スレッド間での排他は楽だけど、同期には使えないよね。 イベント系はカーネルまで落ちるし、プロセス間で使えるから重いよね。 同期に使えて、カーネルまで落ちなくても良いようなヤツが欲しいンだけど、 Windowsでは用意されてない気がするんだ。 それって、正しいのかな?
545 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 03:29:24 ] 2つのスレッドだけでいいのならクリティカルセクションでも同期は取れる。 最初にどちらかのスレッドが所有権を保持するようにする。 片方のスレッドはEnter.....()で所有権が解放されるまで待機。 所有権を持っていたスレッドが所有権を解放すれば片方のスレッドは 実行が開始されるようになる。 高速性が大事でかつ簡易な同期処理でいいならこんな方法もある。 関数自作するとか。排他制御ができれば後は自分でいろいろできる。