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/
75 名前:65 [2005/11/21(月) 00:29:05 ] >>70 >>72 Unixプログラミングすれから、誘導されたんですよ。 >>74 実務レベルだと、 親=オペレータが、起動スクリプト(セマフォ作成)をたたく。 サーバー終了時に、終了スクリプトをたたく。 オペレータ介さないと考えると、init.dに、SXXXXスクリプト)を作成し、 runレベルに合わせて、起動、終了のシンボリックリンクをはる。 なんて感じですかね。
76 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 02:49:56 ] >>75 そりゃ気の毒に、誘導が間違ってる。無責任にこの辺に誘導しとくよ。 「VIPPERでもわかるプログラミング」
77 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 12:01:13 ] >>73 過去の経験から言わせてもらうとライブラリ側で勝手にスレッドを起動するような 作りはあらゆる意味で良くない。 どうしても必要ならばまずそのスレッドで起こりえる可能性をすべて列挙してみる。 スレッドが起動するという事、その際例外が発生した場合どういう処置がなされるべきか、など。 判断がつかなければコールバック等でそのスレッドのトップレベルループや ドメインに該当する処理に対してユーザーが干渉できるようにしたほうがいい。 ↑domain |user_thunk_procedure |thread_callback これらをドキュメント等も含めきちんと導出できないと第三者にはまず提供できない 代物になる。もしくは欠陥を持ったライブラリが完成する。
78 名前:デフォルトの名無しさん [2005/11/22(火) 00:23:28 ] マルチスレッドの例外処理ってどうやってまつか、みなさん。
79 名前:デフォルトの名無しさん mailto:sage [2005/11/22(火) 00:30:02 ] 大域くくって落ちたらやりなおし、 ループでもなんでも、気をとりなおして次の処理。
80 名前:73 [2005/11/22(火) 01:45:30 ] >>77 ありがとうございますた、 厳しいみたいでつね、もっと勉強しまつ。
81 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:09:25 ] winapiスレと迷いましたが、_beginthreadex()に関して質問があります。 現在_beginthreadex(NULL, 0, .....); としてメモリ割り当てを特に指定していません。 現在は実験のためにあるスレッドをいくつも作りたいのですが、 そうすると、エラーが起こりその原因の場所を調べると #endif /* _WIN64 */ return HeapAlloc(_crtheap, 0, size); という箇所でした。毎回ここでエラーが出ているようです。 この原因としてスタック領域のメモリ不足だと自分では思っているのですが、 実際のところはどうなのでしょうか? また何かいい解決方法を教えていただけないでしょうか? 現在は数十スレですが、将来的には数百スレを扱いたいと考えています。
82 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:33:22 ] いいえ、その情報だけですとスタックではなくヒープの確保が失敗したと思われます。 マルチスレッド云々以前に初心者歓迎スレ辺りでソースを晒してみては如何でしょう。
83 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:40:39 ] スレッドが多すぎてヒープ(のアドレス空間)が足りなくなるという可能性も無くはないけど 数十スレッド程度でそんなことになる筈もなく そもそもスタック領域がヒープを圧迫するかどうかという問題も
84 名前:81 mailto:sage [2005/11/28(月) 10:47:04 ] 舌足らずですいません。 エラーが起こるのは_beginthreadex()内の処理のようです。 _beginthreadex()を呼び出して目的のスレッドを作成しようとすると その過程の最中で81のようなエラーが出現してしまいます。 あと、 「メモリがreadになることはありませんでした。」 というメッセージボックスが表示されるのですが 何か関係あるのでしょうか? スレッド数は32、64、96と増やしていきたいのですが 32の段階でのエラーです。
85 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 11:28:40 ] だから、マルチスレッド以前のレベルでバグってるんだろってば。 自分のソースも追えないような蛸なら初心者スレでソース晒せって。
86 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 13:27:17 ] > あと、 > 「メモリがreadになることはありませんでした。」 > というメッセージボックスが表示されるのですが 自分で確保したメモリ領域外のアドレスを読みに行ったときに出る.
87 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 16:58:56 ] エスパーの俺様が、スレ違いのバグを解決してやろう。 malloc系を呼び出したときにライブラリ内でエラーが起こるのは ヒープの管理ブロックが壊れている時だ。 つまり、mallocした領域以外をfreeしたり、同じ領域を2度freeしたり あるいは確保した領域をはみ出して書き込みをした場合に起こる。
88 名前:81 mailto:sage [2005/11/28(月) 22:43:36 ] すいませんでした >87さんのレスを手がかりにmalloc(), free()を中心に調べていったところ p = (int *)malloc(sizeof(short) * num); という箇所がありました。 sizeof(int)に直したところ変なエラーはでなくなりました。 心配されていた方々申し訳ございませんでした。
89 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 00:00:44 ] だから>82や>85がマルチスレッド以前のバグだって指摘してたのに……
90 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 04:05:55 ] うるせえ黙れ
91 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 08:26:55 ] >>88 心配してねーよ。 こいつ馬鹿だなと思っていただけ。
92 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 09:50:47 ] >>88 誰も心配はしてないとおもいます。アドバイスしてただけ。 日常でもそのような勘違いをしているとなぜあの人は自分のことしか考えないのかと思われるので注意しましょう
93 名前:愛也 [2005/11/29(火) 15:57:01 ] 質問なんですが・・・・どなたか教えていただけないでしょうか? (1) 特定のデータを指定するにはアドレス信号を用いる。どれだけのアドレス信号が発行できるかはアドレスバスの本数による。 アドレスバスの本数が8本のときは( 1 )個、12本の時は( 2 )個のアドレスを発行する事ができる。 (2) 容量32KBのメモリがある、このメモリにバイト単位でアドレスをつけた場合(アドレス幅は8ビット)、全アドレスを指定するには、最低( 3 )本のアドレスバスが必要である。 同時に256MBの場合は( 4 )本必要である。 上の問題をどなたかお時間がある方がいらっしゃれば教えていただけないでしょうかぁ?? 何卒よろしくお願い致します。
94 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 16:05:54 ] >>93 板違い
95 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 16:43:14 ] >>93 そのうえ問題自体に間違いがある(w コピペミスかもしれんが(w
96 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 20:19:25 ] HTマシンでpause命令使って効果実感した人いる?
97 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 23:05:15 ] メール欄が空ですよ
98 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 03:43:50 ] 93は、 スレ題名に「マルチスレッドプログラミング相談室」と書いてあるから、 「ここはマ板共用の相談スレに違いない!」と思ったんじゃないの?
99 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 12:03:49 ] マ板?
100 名前:デフォルトの名無しさん mailto:sage [2005/12/07(水) 16:08:17 ] Windows でマルチスレッドを実現するには CreateThread API 以外に方法はありますでしょうか?
101 名前:デフォルトの名無しさん mailto:sage [2005/12/07(水) 16:55:31 ] _beginthread
102 名前:デフォルトの名無しさん mailto:sage [2005/12/07(水) 21:07:21 ] >>101 _beginthreadex使えよ。
103 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 18:32:43 ] つうか何がしたいんだ
104 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 18:52:57 ] いろんな恋がしたい
105 名前:デフォルトの名無しさん mailto:sage [2005/12/10(土) 01:12:51 ] マルチフ恋奴
106 名前:デフォルトの名無しさん mailto:sage [2005/12/13(火) 10:40:34 ] ほしょ
107 名前:デフォルトの名無しさん mailto:sage [2005/12/13(火) 22:06:28 ] >>104 マルチスレッドな恋なんかしてると火吹くぞ
108 名前:デフォルトの名無しさん mailto:sage [2005/12/13(火) 23:24:21 ] 俺のセマフォは3カウントまで。
109 名前:デフォルトの名無しさん [2005/12/14(水) 00:13:25 ] セマフォなんてニッチで泥臭いものは今日日使わないよ
110 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:29:54 ] オレのMutexは一度もLockされたことがない…orz
111 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:32:21 ] そこはまさにCriticalSectionなので、触れてはいけない。
112 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:33:55 ] 一生一WorkerThread。
113 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:35:11 ] オレのFutureはいつまでたっても実体を返さない…orz
114 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:36:37 ] オレのQueueはいつも空っぽ…orz
115 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:44:57 ] Terminateされたい性分なんです、スレッド失格でしょうか?
116 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:50:19 ] だれかJoinしてクレー!
117 名前:デフォルトの名無しさん [2005/12/14(水) 01:10:22 ] オレのQueue、気付いたときにはStackになってた
118 名前:デフォルトの名無しさん [2005/12/14(水) 01:41:29 ] 恋はいつも非同期(asyncronous)
119 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 02:02:00 ] クリスマスなのにDaemonです…orz
120 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 02:45:54 ] 僕の人生Suspendしています。誰が解除してくれるんですか?
121 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 03:08:52 ] 俺はreturnしちゃったよ
122 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 07:50:37 ] signal投げてくれる筈のプロセスがゾンビになっていた件について
123 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 07:55:39 ] それマルチスレッドじゃねーし
124 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 21:50:08 ] 彼女といつも同期に失敗しまつ
125 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 21:52:06 ] 俺はいつもシングルスレッド。
126 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 00:29:14 ] 漏れのセフレはヂュアルコアだから2穴使って楽しめるよ。
127 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 01:08:57 ] おまいら、そろそろ戻ってこい
128 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 04:50:34 ] goto 107
129 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 08:34:28 ] mutex と spin lock の使い分けの基準て何?
130 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 10:49:07 ] 使い分けってお前
131 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 15:45:08 ] mutex: 居間のテレビのチャンネル権取得に使う spin lock: 朝、トイレの空きを待つ時に使う
132 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 15:57:25 ] 後者、spin lockになるのはガマン出来ないときに限られると思われ
133 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 16:18:01 ] スピンロックって、カーネルモードへの移行よりも短い時間しかブロックされない処理、 例えば単純な変数の読み書きなんかに積極的に使いたくなるのだけれど シングルプロセッサのシステムで、 ロックしているときにコンテキストスイッチが起きて 別スレッドがロック取得しようとすると すげー時間が無駄になるんだよね。 それがちょっと嫌。
134 名前:デフォルトの名無しさん [2005/12/17(土) 20:56:42 ] >>133 知ったかはよくないぞ。入社2年目のおぬし。天狗の鼻をへし折られろ。
135 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 21:16:38 ] 我が社では、spin lock の事を フレンドリーに「ぐるぐるくん」と呼んでいる。
136 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 21:35:35 ] 我が社では回転元彌チョップと呼んでいる。
137 名前:129 mailto:sage [2005/12/17(土) 22:48:09 ] >>131 よくわからんです >>133 その単純な変数の読み書き以外に、どうしても spin lock を使い たいんじゃ! とか、spin lock じゃないとうまくいかないような、 典型的なケースってないすか?
138 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 00:05:24 ] >>134 じゃあ、どこがおかしいのか指摘しろよ。 業界最底辺を何年も続けてる事だけが自慢の 低脳プログラマさんよ。 マルチプロセッサでも、 ロックを取得している状態で実行権を奪われたら起こりうるのは確かだけどな。
139 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 00:40:53 ] >>138 だれか解読頼む。
140 名前:デフォルトの名無しさん [2005/12/18(日) 01:43:49 ] >>138 お前の存在そのものがおかしいことを指摘してやらんでもない。
141 名前:デフォルトの名無しさん [2005/12/18(日) 01:46:16 ] 指摘してほしいのに しろよ はないだろ。 せめて、「わたくしは無知なので、できれば、ご指摘いただけないでしょうか?」だろ。 誠心誠意で言葉に気をつけろ。
142 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 01:51:21 ] ナニこいつ
143 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 01:59:03 ] 具体的に指摘しないのは荒らしと同じだから放置汁
144 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 14:48:34 ] チョンはすぐにファビョるからやあねえ。
145 名前:デフォルトの名無しさん [2005/12/18(日) 18:57:20 ] Win32(XP)で下のような排他制御を考えないプログラムを書いて 実際にハングするところを確かめたかったのですが、何度実行しても上手くハングしてくれません たまたま運が良くてハングしなかっただけなのでしょうか?ご教示願います #include <stdio.h> #include <windows.h> #include <process.h> unsigned __stdcall mythread(LPVOID); int main(){ unsigned int thID; HANDLE hTh = (HANDLE)_beginthreadex(NULL, 0, mythread, NULL, 0, &thID); for (int i = 1; i <= 100; i++) { FILE *fp = fopen("test.txt", "a"); fprintf(fp, "Main---%d\n", i); fclose(fp); } WaitForSingleObject(hTh, INFINITE); CloseHandle(hTh); return 0; } unsigned __stdcall mythread(LPVOID lpx) { for (int i = 1; i <= 100; i++) { FILE *fp = fopen("test.txt", "a"); fprintf(fp, "Thread---%d\n", i); fclose(fp); } return 0; }
146 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 19:34:13 ] この程度でハングはしないと思うが、 同期とらない=ファイルの中身はグチャグチャになるの? って意味ならば出力されたファイルを読め。
147 名前:デフォルトの名無しさん [2005/12/18(日) 19:38:13 ] >>146 ファイルもぐちゃぐちゃになりません。きちんと出力されます また、一度に書き込む文字列のサイズを100KB程度と大きくしてもきちんとと出力されます しかし、どちらかのスレッドにSleep(0)等を入れる程度でぐちゃぐちゃになります 境界はどこに有るのでしょうか?
148 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 21:36:48 ] ヒント:ストリーム系はバッファリングされるから混ざりにくい。
149 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 00:03:34 ] fprintf-fcloseの間にスレッドが切り替わらなければセーフ。 んで、100回くらいのループではWindowsのタイムスライスに 引っかからなかったりするのでは。 マルチプロセッサなら、カナリヒドい事になりそうな気がするのだけれど。
150 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 06:15:26 ] >>149 > fprintf-fcloseの間にスレッドが切り替わらなければセーフ。 そうとは限らない。
151 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 10:16:27 ] >>148 「一度に書き込む」っていってんだから、 バファリングの有無は関係ないような気がするんだけど。
152 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 21:48:15 ] そもそもハングするのか? ハングはしないだろ
153 名前:145 mailto:sage [2005/12/20(火) 01:28:57 ] いろいろ調べてましたが IO絡みの関数は基本的にスレッドセーフに作られてるから ってのが答えみたいです お騒がせしました >>149 それは違います。たとえfcloseをコメントアウトしてもハングしません >>152 ハングはしないようですね このページに「大抵ハングしてしまいます」と書かれていて気になったのです www.kumei.ne.jp/c_lang/intro2/no_106.htm まあこのページに限らずネット上でマルチスレッドを初心者向けに教えているサイトでは 大抵同じような書かれ方がされてるので、 もしかすると私の検証が不十分なのかもしれませんが・・・
154 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 04:36:05 ] 同時に書き込んで壊れなくても 後からの書き込みで前の書き込みは上書きされて消える訳だが
155 名前:デフォルトの名無しさん mailto:sage [2005/12/24(土) 14:28:30 ] >>153 ランタイムライブラリがスレッドセーフで無い場合はハングするかもしれないけど、 VS2005からシングルスレッドのランタイムは無くなっているなあ。
156 名前:デフォルトの名無しさん mailto:sage [2005/12/24(土) 14:44:54 ] 「ハングする」なんて言い方は止めて、 「動作が未定義」くらいにしてくれないか。 本当にハングアップするかどうかを問題にしているんじゃないだろ?
157 名前:デフォルトの名無しさん [2005/12/25(日) 13:24:46 ] >>156 このマニアめが。
158 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 13:38:00 ] /MT ってやってればたいがい大丈夫だろうけど、スレッドセーフでない関数で gethostbynameとかが未定の動作されるとかなり困る、 無理矢理排他同期とって使ってるけどなんかかっこ悪い。
159 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 13:45:27 ] winsockのgethostbynameはスレッドセーフじゃなかったっけ?
160 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 13:49:25 ] /MTってことはWindows? getaddrinfoはMT-Safeでしょ。 msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/getaddrinfo_2.asp には明記してないけど、gai_strerrorは違うから〜って書いているくらいだから。
161 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 13:54:49 ] 明記してあるな。 >Remarks >The gethostbyname function returns a pointer to a hostent structure-a structure allocated by >Windows Sockets. The hostent structure contains the results of a successful search for the >host specified in the name parameter. >The application must never attempt to modify this structure or to free any of its components. >Furthermore, only one copy of this structure is allocated per thread, so the application should ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > copy any information it needs before issuing any other Windows Sockets function calls.
162 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 13:57:38 ] struct hostent *host; host = gethostbyname(argv[1]); ってな形だし、どうみてもスレッドセーフでないと思ってた。 スレッド固有メモリなんてものでも使ってるのかな。
163 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 14:14:38 ] >>161 それだけでMT-Safeだとは限らない。
164 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 14:50:26 ] getaddrinfo ってのがあるんだ、 参考にしてた本が古っかったので知らなんだ。 該当箇所を書きかえねば orz
165 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 15:28:14 ] 2ちゃんで書き込みするときの文字2048制限解除方法誰か教えてください。
166 名前:デフォルトの名無しさん mailto:age [2005/12/25(日) 15:29:18 ] 制限解除して書き込んでる人が増えてるんですが
167 名前:デフォルトの名無しさん mailto:sage [2005/12/25(日) 15:38:13 ] >>164 古いWindowsではありませんのでその辺は配慮を。
168 名前:デフォルトの名無しさん mailto:sage [2005/12/26(月) 03:11:55 ] 「スレッドできる」と「スレッドでファイル操作しても問題ない」は同義じゃないよなあ。 単一リソース操作は対策しないと普通は競合するよ。
169 名前:デフォルトの名無しさん mailto:sage [2005/12/26(月) 19:09:27 ] マルチスレッドなサーバプログラムを作ってみようかと思ってます クライアント数が少ない場合1クライアントに1スレッドを割り当てればいいかなと思いますが クライアント数が多い場合はどういった方法が良いんでしょうか? 1スレッドあたりのクライアント数を決めてスレッドごとにselect()するとか 親スレッドでselect()して処理を別スレッドに任せるとか一応考えてはみていますが どういった方法がスタンダードなんですかね?
170 名前:デフォルトの名無しさん mailto:sage [2005/12/26(月) 20:42:42 ] ジョブキュー
171 名前:デフォルトの名無しさん mailto:sage [2005/12/26(月) 22:37:27 ] +スレッドプール
172 名前:デフォルトの名無しさん mailto:sage [2005/12/26(月) 23:38:08 ] 裏技としてApache 勉強にはならんな・・・
173 名前:デフォルトの名無しさん mailto:sage [2005/12/27(火) 13:56:11 ] apacheって何言ってんの? ネットワークプログラミング相談室にも沸いたバカだろか。
174 名前:デフォルトの名無しさん mailto:sage [2005/12/28(水) 15:39:12 ] なぜそこで、あと半歩踏み込んで「apache馬鹿よね〜」とか言えないよねぇ
175 名前:デフォルトの名無しさん mailto:sage [2005/12/28(水) 16:51:48 ] おバカSunよね〜