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