[過去ログ] マルチスレッドプログラミング相談室 その3 (978レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(2): 04/10/20 19:28 AAS
マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。
その1 2chスレ:tech
その2 2chスレ:tech
852: 846 2005/08/06(土)19:43 AAS
>>850-851
うん、俺の勘違いだった
スマソ
853(1): 2005/08/06(土)19:47 AAS
gccの__threadってなんなの?
int pthread_key_create(pthread_key_t *key, void (*destr_function) (void*));
int pthread_key_delete(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *pointer);
void * pthread_getspecific(pthread_key_t key);
のsyntax sugar?
854: 2005/08/06(土)19:51 AAS
スレッドプロシージャをクラス内に実装する裏技(といっても常套手段)使えば
大域変数みたいに使うことはできる。
てかCreateThreadに渡すダミーのスレッドプロシージャにthisポインタ渡してメンバ関数を起動するだけだから。
(Win32での話)
855: 2005/08/06(土)20:19 AAS
>>853
機能的には同じようなものだが、普通は__threadのほうが遥かに高速に動作する。
外部リンク[pdf]:people.redhat.com
上記PDFにあるように、ローダやダイナミックリンカなどと連係して
間接参照数回程度のコストで動作するようになっている。
まあ、逆に言うと、スレッドライブラリだけでなく、
ローダやリンカも対応してないと__threadは使えないってことになるが。
856(5): 2005/08/07(日)01:27 AAS
さんざん既出かもしれないけど、質問します。
windowsでpthreadの状態変数みたいなのはどう実現すればよいのでしょうか?
排他変数にMutexをつかうならSignalObjectAndWaitをつかえばよいんだけれども
CriticalSectionを使いたいんです。
857: 2005/08/07(日)01:30 AAS
状態変数に近いのはイベントオブジェクトじゃない?
858(1): 2005/08/07(日)09:09 AAS
状態遷移マシンの実装を語るスレがほしいな。
859(1): 2005/08/07(日)13:02 AAS
>>858
○| ̄|_ ̄|○ <オマエ「状態遷移マシン」て言ってみたかっただけだろ!
860: 2005/08/07(日)13:03 AAS
正規表現ライブラリのソースをみるとか
マルチスレッド関係ないな
861: 856 2005/08/07(日)13:18 AAS
> 状態変数に近いのはイベントオブジェクトじゃない?
そうなんですけど、pthreadの場合、 状態変数をwaitするとき
mutexを渡して内部でアトミックにmutexをアンロック→シグナル待ち→mutexのロックをしてて
これをwindowsで実現できないかなと・・・
WindowsのばあいMutexをWait〜系関数で待つことは出来るけど、CriticalSectionは使えない。
たとえばpthreadで状態変数をつかっているようなところを
windowsに移植するときはどうしたらよいのかなと思いまして・・・
862: 856 2005/08/07(日)13:20 AAS
> 状態変数に近いのはイベントオブジェクトじゃない?
そうなんですけど、pthreadの場合、 状態変数をwaitするとき
mutexを渡して内部でアトミックにmutexをアンロック→シグナル待ち→mutexのロックをしてて
これをwindowsで実現できないかなと・・・
WindowsのばあいMutexをWait〜系関数で待つことは出来るけど、CriticalSectionは使えない。
たとえばpthreadで状態変数をつかっているようなところを
windowsに移植するときはどうしたらよいのかなと思いまして・・・
863(1): 2005/08/07(日)13:51 AAS
aprだと、EventとMutexを使ってcond_wait/signalをエミュレートしてるね。
もちろん、cond_waitに渡すmutexはCRITICAL_SECTIONで良くて、
Mutexを使っているのはWaitForで待つためらしい。
外部リンク:apr.apache.org
864: 2005/08/07(日)14:18 AAS
クラス内のメソッドを並列で実行したいのですが、やり方がわかりません。どこかに参考になるページはありませんか?
865: 856 2005/08/07(日)14:46 AAS
>>863
ありがとうございます。参考になりました。
どうやらcondに渡すのはCRITICAL_SECTIONみたいだけど、
cond内部でMutexを持っていてそれを用いて排他制御を行いつつ、
CRITICAL_SECTIONアンロック→シグナル待ち→CRITICAL_SECTIONロックしているみたい。
(apr-1.1.1\locks\win32\thread_cond.c)
866: 2005/08/07(日)15:33 AAS
>>859
ばれたか。
でもWindowsでWindowMessageを使って実装する例とか、
専用のクラスの実装例とか、どんな問題があってどんなメリットがあるとか
そういうことを勉強したかったのもあるよ。
867: 2005/08/08(月)01:01 AAS
pthread_cond_signal/broadcastの実装には
シグナルとウエイトをアトミックにやる必要がある。
「アトミックに」ってところが重要で
シグナルしてウエイトするというようにバラバラやっていたのではダメ。
それをする手段は、Win32だと、SignalObjectAndWaitしか知らん。
868: 2005/08/08(月)03:11 AAS
?
869(3): 2005/08/09(火)16:17 AAS
mutex といえば、Boost.Thread の Win32 版 mutex の実装に、
CRITICAL_SECTION ではなくて、Mutex が利用されていたな。
Win32 の Mutex は遅いから、メータードセクションを利用して
実装して欲しかった。
870: 2005/08/09(火)19:11 AAS
>>869
今1.32のソース見たけど、クリティカルセクション使ってたよ
871: 2005/08/09(火)20:12 AAS
>>869
メータードセクションってこれ何時頃から実装されてるの?
MSDNみて、こんなの有ったのかと目から鱗状態なんだけど。
95でも使えるっぽいから、相当前からある様なんだけど。
872: 2005/08/09(火)21:36 AAS
自己レス。
APIとしてSDKに実装されてるわけじゃないのね。
MSDN英に.hと.cのフルソース上がってたからもらってきた。
mutexと置き換えて遊んでみる。>>869ありがと。
873(1): 2005/08/10(水)15:20 AAS
うろ覚えだが、メータードセクションは、ロックカウントを持っていないので、
クリティカルセクションのつもりでリソースを1にして、
同じスレッドで複数回 EnterMeteredSection すると、あとあと面倒だったかも。
874: 2005/08/16(火)18:00 AAS
メータードセクションなんで初めて知ったよ
みなさんスゴイすね
875: 2005/08/21(日)13:45 AAS
>>873
それなら自分でReentrantな実装にしちゃえば?
876: 2005/08/22(月)16:00 AAS
メータードセクションのReentrantな実装に改良している最中に、
以前AdvancedWindowsのオプテックスを
セマフォ的にしたものを作ったのを思い出した。orz
とても不毛な月曜の午前。
877(1): 2005/08/26(金)14:48 AAS
基本的な質問します。
stringとかのポインタをスレッドに渡し、スレッドより先にメインが終了してしまった場合、
そのstringはもう生きていないですよね。
こういうときはどうやって処理をすればいいのでしょうか?
878: 2005/08/26(金)14:52 AAS
>>877
寿命管理ができないなら、実体で渡す。
実体渡しが嫌なら、サボらずにちゃんと寿命管理を行う。
879: 2005/08/26(金)14:52 AAS
○| ̄|_ ̄|○ <メインが終了したらプロセス全体が終わるだろ
880: 2005/08/26(金)15:11 AAS
がんがって実態渡ししてみます。
881: 2005/08/26(金)15:44 AAS
メインが終了したらアプリ全体が終わっちゃうから、
スレッドでの処理が終わるまでメインを待たせろつーの。。
882: 2005/08/26(金)22:18 AAS
○| ̄|_ ̄|○ < ああ、面倒くせーな!
883(1): 2005/08/28(日)13:15 AAS
マルチスレッドアウトな関数multithreadout()があります。
この原因はグローバル変数glbを使っていることです。
通常、同一プロセス内でmultithreadout()を使うと駄目ですが、
multithreadout()をdllファイルにしてもマルチスレッドアウトのままでしょうか?
884: 2005/08/28(日)14:06 AAS
>>883
Yes.
DLL(が読み込まれたメモリ空間) はプロセススコープの資源。
885: 2005/08/28(日)14:07 AAS
はい
886: 2005/08/28(日)14:30 AAS
解決する方法として
1).マルチプロセスにする。
2).multithreadout()だけをexeファイルにして引数を受け渡す(パイプを使う&dllを使用しない)
3).multithreadout()をdllファイルにし、multithreadout()呼び出し専用の
exeファイルを作り、パイプを使う
2).3).の違いはmultithreadout()が静的か動的かなのですが、
他に解決する方法はありますか?間違った解決方法を考えていませんか?
また、処理のほとんど(90%以上)はmultithreadout()が行います。
呼び出し回数は数回程度です。
887: 2005/08/28(日)14:40 AAS
グローバル変数を使わないように、multithreadout()を変更する
と言う選択肢もあるはず
888: 2005/08/28(日)14:42 AAS
multithreadout() を multithreadout_real()
か何かにリネームして、
multithreadout()は、
multithreadout()
{
static CriticalSectionとかMutexとか lock;
Lock(lock);
multithreadout_real();
Unlock(lock);
}
あたりにすればいいんじゃないかと思う。
例外処理とか、lockの初期化は適当に。
889: 856 2005/08/28(日)17:35 AAS
以前紹介してもらったaprのミューテックスなんだけど、よく見ると怪しい部分があるような気がしてきた。
broadcastのときwaitしているスレッドを数えるためにカウントしているんだけど、
イベント待ちの直後そのカウンタをインクリメントする必要があって、その部分がクリチカルになっていない。
どうなんだろう?自分は怖いんでカウンタをCRITICAL_SECTIONで囲んだけれども。
890: 856 2005/08/28(日)17:46 AAS
あう、mutexじゃなくてconditionだった。スマソ
891(3): 2005/08/30(火)06:42 AAS
signalとかbroadcast待ってる香具師ってスピンしてんの?
古いイベントで使うようなselectとかとどっちが速い?
892: 2005/08/30(火)06:44 AAS
×古いイベント
○古いイベント志向
すまそ。
893(2): 2005/09/01(木)23:51 AAS
selectって古いイベント志向といういいかたするのか?
ま、それはさておき、遅いか早いかは
実装による。
以上だ!
894(2): 2005/09/01(木)23:51 AAS
selectって古いイベント志向といういいかたするのか?
ま、それはさておき、遅いか早いかは
実装による。
以上だ!
895: 2005/09/02(金)00:20 AAS
>>893-894
ちゃんと排他制御しろよ
896: 2005/09/02(金)00:41 AAS
この読みが外れればそれを口実に日本に戦争を仕掛けるつもりだったのか
897: 2005/09/02(金)00:43 AAS
↑
誤爆しました。メンゴ
898(1): 2005/09/02(金)03:07 AAS
>>893-894
イベントとか割り込みって、中でselect使ってんじゃね?
899(3): 2005/09/04(日)08:45 AAS
Solarisだと、select(3C)はpoll(2)を使ってる
900: 2005/09/04(日)13:10 AAS
>>899
それは昔の話で、select(3)の実装がpoll(2)を使わないように2,3年前に変わらなかったっけ?
901: 2005/09/04(日)18:49 AAS
そんな重要そうな事もはっきりしないのがUNIX文化ってやつですね
902: 2005/09/04(日)19:39 AAS
selectもpollも対して変わらんよ。じゃあ
「イベントとか割り込みって、中でpoll使ってんじゃね?」
と言えばいい?
903(1): 2005/09/04(日)21:32 AAS
ちゃんとCPU返してくれればどうでもいい。
たまにビジーループぶん回すのがいるからのう…
904(1): 891 2005/09/05(月)00:08 AAS
>>903
えっと、まさにそこを聞きたかったんすけど。
ループしてるか見分ける方法ってある?
905: 2005/09/05(月)10:46 AAS
>>898
んなわけねー(w
>>904
お前以外にループする奴はいない。in お前のプログラム&カーネル。
906: 891 2005/09/05(月)23:58 AAS
何言ってるのかわかんないんだけど。
907: 2005/09/06(火)14:49 AAS
>>899
windowsはどうなんですか?
908: 899 2005/09/06(火)21:37 AAS
Windowsは詳しくないから分からない
というか、こんなの聞いてどうなるものでもないような
909: 2005/09/06(火)22:23 AAS
>>891
> signalとかbroadcast待ってる香具師ってスピンしてんの?
ロックが競合したときにmutexの入口でスピンすることはあっても、
signalとかbroadcastを待ってる状態(つまり条件変数をwaitしている状態)で
スピンし続けてCPUを離さないってことはありえない。
そんな実装があったら、条件変数の意味が無くなるだろ。
910(1): 2005/09/06(火)22:44 AAS
スピンとポーリングって何が違うの?
911: 2005/09/06(火)22:54 AAS
スピン = 無期限連続ポーリング
912(1): 2005/09/06(火)23:21 AAS
>>910
spinってのはSMPで一つのCPUだけがポーリング対象の資源を
得ることが出来るようなポーリングの仕方のことを言う。
皆がアクセスできる皿と、自分の手元の皿を夫々がくるくる入れ替えて
手元に来た皿に肉が乗ってたら食べていい、みたいな感じ。
913(1): 2005/09/07(水)03:41 AAS
>>912
一面的な説明で「仕方のことを言う」はいかがなものか。
914: 2005/09/07(水)03:55 AAS
>>913
文句だけじゃなくて、一面だけというのなら別の面からとか
包括的な説明とか、内容あるレスつけようぜ。
915(2): 2005/09/07(水)07:23 AAS
スピンしないポーリングって可能なのか。
スレッドとかシグナルってハードレベルでどうなってるのか
わからなくて効率が全然読めないんだが、
その辺をユーザーレベルで理解できる本、サイトない?
916(1): 2005/09/07(水)09:07 AAS
WindowsならAdvancedWindowsという本かな。
これ読むとWindowsでポーリング待ちなんて馬鹿げてると思うはず。
917(1): 2005/09/07(水)09:13 AAS
>>916
Windowsよく知らないので、詳しく!
918: 2005/09/07(水)09:14 AAS
最前線UNIXのカーネル
外部リンク:www.amazon.co.jp
Solarisインターナル−カーネル構造のすべて
外部リンク:www.amazon.co.jp
この辺りの本が詳しいけどね。どのOSでも基本は同じだし。
この辺りが難しいようなら、
OSの基礎と応用−設計から実装、DOSから分散OS Amoebaまで
外部リンク:www.amazon.co.jp
なんかが定番になっているけれど、同期関係は記述が少ないし、
そもそもこの本は全般的におおざっぱな解説に終始するな。
919: 2005/09/07(水)09:53 AAS
詳しく!
920: 2005/09/07(水)09:54 AAS
分散OS ”あ萌え場”って何でしょうか?
921(1): 2005/09/07(水)12:05 AAS
>>917
「Advanced Windows」嫁
あとは「Win32 マルチスレッドプログラミング」
つーかこの話で本が1冊出来るかもよ
922(2): 2005/09/07(水)12:58 AAS
>>915
非SMPではspin lockなど使わずにタダのループによるポーリングで十分
(カーネルモードで、割り込みを考慮しないとして)。
また、競合するスレッド/プロセスがいない場合には、SMPだろうが割り込みが
あろうが単純ループのポーリングで十分。
効率的な点については、spin lock の一サイクルはメモリ<->レジスタ間の
値の入れ替えで完了するので、行儀良く短いクリティカルセクションから
なるコードの場合は(並列度にもよるけど)、わざわざスケジューラをいじって
スレッドをシグナル待ちにするような処理よりも単にspin lockの方が効率が良い。
923(1): 2005/09/07(水)13:14 AAS
>>922
> (カーネルモードで、割り込みを考慮しないとして)。
> また、競合するスレッド/プロセスがいない場合には、
殆んどあり得ない仮定を置いて、何を言っているんだが…
924: 2005/09/07(水)13:30 AAS
>>923
バカ?スピンロックについての話なら、普通割り込みも競合もあるけど、
915は「スピンしないポーリングって可能なのか。」って聞いてるわけで、
単に「ポーリング」って言った場合には>>922の条件は良く有ることだと
思うけど。
925: 2005/09/07(水)14:06 AAS
ポーリング儲は糞プロセス量産してんだろうね
926: 2005/09/07(水)14:22 AAS
ものすごい短時間しか待たないことがわかってるなら、ポーリングの方が効率いいこともあるべ。
927: 2005/09/07(水)14:33 AAS
>>915
同期無しでただ読むだけで済むように設計すればいい
928: 2005/09/07(水)16:24 AAS
>>921
Windowz使ってないので、「Advanced Windows」読んでも意味ないし
929: 2005/09/07(水)18:41 AAS
MINIX使ってないので、「オペレーティングシステム―設計と理論およびMINIXによる実装」読んでも意味ないし
930: 2005/09/07(水)19:13 AAS
はあ。
Windowsは業界スタンダードだから意味あるはずだけどねえ
931: 2005/09/07(水)20:05 AAS
何業界だ?
932: 2005/09/07(水)20:08 AAS
Window業界でのはなしでしょう
933(2): 2005/09/07(水)22:20 AAS
windowsのイベントや、UNIXのsignalは、プログラマからみれば
APIとしてはコードのその場所でじっとwaitしてる形になると思うけど
イベントやsignal自体の内部実装(カーネル側?)
では結局はポーリングで実現されてたりするわけ?
934: 2005/09/07(水)22:24 AAS
エロゲー的にはポーリングが正義、というFAが出ておりますが何か?
935: 2005/09/07(水)22:28 AAS
割り込みにきまってんだろハゲ
936: 2005/09/07(水)22:34 AAS
>>933
signal trampoline
937(3): 2005/09/13(火)18:52 AAS
>>933
イベントやシグナルみたいな大掛かりなものはスレッド自体が
待ち状態になってスケジュールしなおされる。
スピンロックで待つのはWin32でSMPのEnterCriticalSection(記憶違
いかも)とか、Windows の WDM のコードとか、linux のカーネル内の
コードとかでスケジューラを動かすまでもないホンのちょっとの排他
処理を行うとき。
938: 2005/09/13(火)22:59 AAS
なるほろ
939: 2005/09/16(金)02:59 AAS
今2wayの鯖あるのですが、2つのCPUを効率よく使って計算させようと思うと
スレッド間でメモリ共有するだけでいいでしょうか?何か気をつけることないですか?
940: 2005/09/16(金)03:10 AAS
意味若乱
941: 2005/09/16(金)03:35 AAS
逆になるべく共有リソースを無くして独立させる方が良いと思う。
共有してると、アクセス排他制御とか同期制御とかが絶対必要。
942(1): 2005/09/16(金)03:52 AAS
ていうかスレッドはメモリを共有してるもんでしょう
943(1): 2005/09/16(金)07:09 AAS
>>942
メモリ空間は共有してても、同じメモリアドレスを共有してなきゃ問題ないじゃん。
944: 2005/09/16(金)08:49 AAS
>>943
財布は共有してても生活空間は共有しない
という独立思考の高い夫婦モデルだな
945: 2005/09/16(金)09:48 AAS
まあ普通プロセス/タスク内のスレッド間ではメモリを共有してるけどな。
946(2): 2005/09/21(水)19:20 AAS
>>937
なんか変じゃない?
スレッドがスケジューリングされなきゃ、何時まで経っても他スレッドが実行されず、
状態が変化しないのと違う?
947: 2005/09/21(水)20:05 AAS
>>946
完全に協調型ならそうなりますな。
普通は外的要因で叩き起こされると思いまふが。
948(1): 2005/09/21(水)20:15 AAS
>>946の行っている意味が分からないので解説して。
>>937のどの部分に対していっているの?
949: 2005/09/21(水)20:16 AAS
元の質問も、その答えも、高度すぎて意味がわからん
950: 2005/09/21(水)23:40 AAS
>>948
いつまでもspinlockの所有権をacquire しようとし続けると
デッドロックしてしまうということ。
なわけでデッドロックしないように考慮する必要がある。
具体的には、
Win32 API のCritical Section の場合にはInitializeCriticalSectionAndSpinCountで
「スケジューリングしないでぐるぐる回る回数(の上限)」を設定して使う必要があるし、
外部リンク[asp]:msdn.microsoft.com
Windows のカーネル内でKeAcquireSpinLock なんかを使う場合にはdispatch level とか
も考慮して、acquire したら自コンテキストの実行が中断されないうちにすぐreleaseすることが
要求されている。
外部リンク[asp]:msdn.microsoft.com
951: 2005/09/21(水)23:50 AAS
要するに、
>>937
> スケジューラを動かすまでもない
を「自分からyeild()しないで」等に書き直した方がいいって事ね。
952: 2005/09/22(木)03:02 AAS
そもそもSMPでスケジューラ等を実装するには、
スピンロック等の低レベルな排他機構が必要なわけで…
953(1): 2005/09/22(木)11:44 AAS
マルチスレッドと、ウィンドウプロシージャについて質問なんですが、
現在、通信系のプログラムを書いています。
あるデータを受信したら処理をして、その結果を送信元に返信する。
という関数があるのですが、
1).スレッドを作り、そのスレッドで処理をさせる。
2).ウィンドウプロシージャを作り、メッセージにデータのポインタを渡す。
ウィンドウプロシージャで処理を行わせる。
この2通りを考えてみたんですが、楽なのは2)です。
どっちの方法が有効でしょうか?
954: 2005/09/22(木)11:48 AAS
スレッドを使ってブロッキングでやるのが1番楽だと思う
955: 2005/09/22(木)14:02 AAS
>>953
結局1)が楽です。
956(2): 2005/09/22(木)16:32 AAS
こんにちは。
gcc(RHEL), MinGW(Win), Visual Studio .NET(Win)の各環境でC++を使って私用ミニツールなど
を作ったりして仕事してる、一介の営業マンです。最近はサービスでお客さん用のツールなんか
も作ったりし始めました。SE受注減らしてどうするんだって感じですが。
C/C++でのpthreadに関する質問です。
pthread_createでガーっと並列にスレッドを作って仕事をさせ、pthread_joinを回して終了を待つわけな
のですが、
pthread_joinはブロックするので、先頭のスレッドが長引いちゃうと後に続くスレッドが先に終わってても
ボケーっと待ってしまいますよね。
これを、スレッドが終了した順に処理する方法ってありますでしょうか?
よろしくお願いします。
957: 2005/09/22(木)16:46 AAS
例えばこんな風にすればいいんじゃない?
* 生きてるスレッド数を数えるカウンタを用意しておく。(スレッド数で初期化)
* 各スレッドは終わるときにカウンタを減らして、ゼロになったら pthread_cond_signal() みたいなことをする。
* メインは pthread_cond_wait() かなんかで待ち。
* 起こされた時にはスレッドは全部終わってるはず。
* もちろんカウンタをいじるときは排他制御。
958: 2005/09/22(木)16:48 AAS
あと、スレッドが終わる度になんかするなら、
* 各スレッドは終わるときにカウンタを減らして、 pthread_cond_signal() みたいなことをする。
* メインは pthread_cond_wait() かなんかで待ち。
起きたときにカウンタがゼロになってたら全部終わってるはず。
959: 2005/09/22(木)16:53 AAS
どうせ全部まとめて終了を待つなら、順番にjoinするだけで何の問題もないと思うけど。
メインスレッドはワーカースレッドを終了を順次待ちつつ何かしてる必要があるなら、
キューを用意してスレッドが終了前に自分のpthread_tを追加するとか、
メインスレッドがイベントループなら終了を通知するイベントを投げるとか。
960(1): 2005/09/22(木)19:33 AAS
> 全部まとめて終了を待つ
逆です
早く終わったスレッドの順に次のジョブキューに入れるやり方ですね
961: 2005/09/22(木)19:36 AAS
それならスレッドプールでしょ
962: 2005/09/22(木)19:42 AAS
元の質問文と真実の内容がかけ離れてんな
963(1): 2005/09/22(木)20:10 AAS
>>960
>早く終わったスレッドの順に次のジョブキューに入れるやり方ですね
その場合はスレッド終わっちゃいけないから、joinなんか使えないと思われ
964: 2005/09/22(木)20:30 AAS
リスト構造にしたらいいんじゃね?
965(1): 2005/09/23(金)01:37 AAS
>>963
pthread_cleanup_push()で登録するとか。
966(1): 956 2005/09/29(木)20:31 AAS
つまりこんなかんじ?
1. 子スレッドはその仕事の最後にグローバル関数で
「俺は終わりましたフラグ」を立ててから死ぬ
2. メインのスレッドは全部の子スレッドの「俺は終わり
ましたフラグ」を監視しながらぐるぐる回ってる
3. あるスレッドの「俺は終わりましたフラグ」が立ったら、
そのスレッドの計算結果を取得して次の仕事に放り込む
んー、スレッドの数が不定なので、俺は終わりましたフラグの
作り方と監視の仕方の実装に工夫が要りそうですね。
967: 2005/09/29(木)21:40 AAS
>>956
なぜスレッドを使って並列でしようとしてるのかが見えないんだけど・
本当にマルチスレッドにする必要あるのかな
968: 2005/09/29(木)21:43 AAS
つか>>965は無視なんか?
969: 2005/09/29(木)21:56 AAS
リスト構造でやってみたらと・・・
//スレッドに持っていく構造体
typedef struct tag tag;
struct tag{
tag *next;//初期化してNULLにしておく
・・・
};
//メインが持つグローバルデータ
tag *root;
tag *last;
int flg;
計算が終わった子は
flgが特定の値であれば待機。
flgが特定の値でなければ特定の値にして
rootがNULLでなければlast->nextに自分の構造体のアドレスを登録。
rootがNULLであればrootとlastに自分の構造体のアドレスを登録。
メインスレッドは
flgが特定の値であれば待機。
flgが特定の値でなければ特定の値にして、
構造体のデータを取り出す。
root=root->next;とする。
flgの値を戻す。
ま、こんな感じでどうざんしょ。
970: 2005/09/29(木)22:00 AAS
>>966
漏れならこうするよ。
メインスレッド
1. ジョブをキュー(FIFO)に登録。
2. ワーカスレッドを妥当な数だけ生成
3. pthread_cond_wait() か何かで待ち、ジョブのキューが空になっていたら完了。
ワーカスレッド
1. ジョブをキューから取り出して実行
2. 完了したら、その結果を利用した「次の仕事」を(もしあれば)ジョブキューに入れる。
無ければスレッド終了。
3. 1に戻る
971: 2005/10/01(土)13:03 AAS
pthread_cond_waitとかpthread_cleanup_pushとか、クレバーなコーディングはご法度
972(1): 2005/10/03(月)13:56 AAS
クリティカルセクションとミューテクスはどちらがお勧めなのでしょうか?
ダンディーな方、教えてくださいませ。
973(1): 2005/10/03(月)14:47 AAS
>>972
オススメと言うか、その2つは使い分けるもの。
Win32の場合の話だけど、
プロセス内でのスレッドの同期程度ならクリティカルセクションを用いる。
複数のプロセスで排他を行いたいなら、ミューテックスの類を使う。
SMPで無ければ効率は同じ。SMPの場合にはInitializeCriticalSectionAndSpinCount の説明を参照。
974(1): 2005/10/03(月)18:16 AAS
>>973さん
なるほど、納得しました!
どうもありがとうございました。
975(1): 2005/10/03(月)19:09 AAS
>>974
まだあった・・
複数の同期オブジェクトを待ったり、待っている最中にWindowメッセージや
COMのLRPC(外部スレッド/プロセスからのCOM呼び出し)を処理する必要
があるなら Mutex。
976: 2005/10/03(月)19:28 AAS
>>975
色々違いがあるんですね。
ご丁寧に有難うございましたm(_ _)m
977: 2005/10/11(火)23:14 AAS
age
978: 2005/10/29(土)03:13 AAS
お舞らたとえばですがファイルの内容をメモリ上に展開しそこにほかのスレッドがアクセスする必要があるとしたらどんな風に書きますか?
・データは木構造
・IOからメモリに展開するスレッドは複数
・そこにUI スレッドや、計算スレッドが頻繁にアクセスする。リーダーとライターが複数ずついる。
・ためしにクラスレベルロックみたいのでやったらUIスレッドでCPUが100%言ってないのにたまに固まる(1秒以下)ことがある。
こういう場合ってどんな風にするもんなんでしょう。粒度さげると書くのが('A`)マンドクさくなるしデッドロックの危険も出てくる。
一般解や俺ならこうしてるってのがあればよろ。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.223s*