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/
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よね〜
176 名前:デフォルトの名無しさん mailto:sage [2006/01/02(月) 08:35:56 ] くだらない質問ですみませんが TCPで同じディスクリプタにread()するスレッドとwrite()するスレッドを分けたとき 全二重だから同時にread()とwrite()を実行しても問題ありませんよね? あと片方が同期無しでclose()するのって問題ありますかね
177 名前:デフォルトの名無しさん mailto:sage [2006/01/02(月) 08:40:05 ] 同時にread/writeしても問題なし。 HTTPサーバのようなものを作ってるなら相手が一方的にclosesocketしたくらいでおかしくなっては困る。
178 名前:デフォルトの名無しさん mailto:sage [2006/01/02(月) 12:25:53 ] Solaris2.xではデッドロックしてたなあ(遠い目)
179 名前:デフォルトの名無しさん mailto:sage [2006/01/03(火) 03:50:46 ] x86 とかで int の値を書き込むスレッド(A)と読み込むスレッド(B)がある場合, 更新途中の値が(つまり 32bit 中の 16 bit が新しい値で残りが古いままとか) B に見えてしまうということはありうるでしょうか? # long とかだとまずいですよね.
180 名前:デフォルトの名無しさん mailto:sage [2006/01/03(火) 04:40:29 ] >>179 前スレで延々やってたと思う そこが本題でなければ、排他で済ませて先行った方がいいと思うヨ
181 名前:デフォルトの名無しさん mailto:sage [2006/01/03(火) 04:56:02 ] >>180 レスありがとうございます.前スレの読み方がよく分からないので憶測になっ てしまいますが,前スレの議論では結局「あり得る」という結論に至ったとの 理解で良いでしょうか? 参考になりそうな資料へのポインタを教えて頂けるとうれしいです. > そこが本題でなければ、排他で済ませて先行った方がいいと思うヨ 性能的な面から可能な限り B に対する排他処理は避けたいと考えています.
182 名前:デフォルトの名無しさん mailto:sage [2006/01/04(水) 15:07:19 ] >>181 OSに用意されている、Atomicな書き換えAPIを利用すれば宜しかろう。 32ビットバスでアライメントも合っていれば素直にAtomicに書き換わると思うが。
183 名前:デフォルトの名無しさん mailto:sage [2006/01/04(水) 16:15:06 ] レスありがとうございます。調べてみます.
184 名前:デフォルトの名無しさん [2006/01/13(金) 02:07:27 ] マルチスレッドプログラミングで注意することを列挙してくれ。
185 名前:デフォルトの名無しさん mailto:sage [2006/01/13(金) 02:19:22 ] ひとつ!急いで口で吸え!
186 名前:デフォルトの名無しさん mailto:sage [2006/01/18(水) 14:53:41 ] ふたつ! 不埓な悪行三昧!
187 名前:デフォルトの名無しさん mailto:sage [2006/01/18(水) 16:18:23 ] みっつ! 想定の範囲内です。
188 名前:デフォルトの名無しさん mailto:sage [2006/01/18(水) 16:55:53 ] よっつ、読んでも書いちゃダメ
189 名前:デフォルトの名無しさん mailto:sage [2006/01/18(水) 16:56:28 ] いつつ、いつも心に排他処理
190 名前:デフォルトの名無しさん mailto:sage [2006/01/18(水) 16:59:48 ] むっつ、無理せずmutex
191 名前:デフォルトの名無しさん mailto:sage [2006/01/18(水) 17:21:48 ] ななつ、仲良くSemaphoeで共有
192 名前:>>46 mailto:sage [2006/01/18(水) 23:32:09 ] やっつ、やっぱりここでも排他処理
193 名前:デフォルトの名無しさん mailto:sage [2006/01/19(木) 00:43:25 ] ここのつ!心を鬼にして排他処理
194 名前:デフォルトの名無しさん mailto:sage [2006/01/19(木) 01:03:03 ] 糞スレ立てんな
195 名前:デフォルトの名無しさん mailto:sage [2006/01/19(木) 01:39:58 ] とう、でとうとう割り込まれた。 排他だけじゃなく、割り込み禁止も忘れないでね☆
196 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 01:53:34 ] HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)で作ったイベントに対して SetEvent(hEvent);←TRUEがかえる でも、その次に WaitForSingleObject(hEvent, 0)とやってもWAIT_OBJECT_TIMEOUTがかえる。 こういうことがおきているのですがどのようなことが考えられますか?
197 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 07:15:10 ] >>196 SetEventは成功したけど、イベントオブジェクトがシグナル状態になる前にWaitForSingleObjectがタイムアウトした。
198 名前:>>46 mailto:sage [2006/01/21(土) 09:16:54 ] >>196 他のスレッドが一生懸命 ResetEvent(hEvent) を やってる。
199 名前:196 [2006/01/21(土) 14:20:25 ] >>197 SetEventってシグナル状態にした後で戻るわけではないのですか? >>198 ソースを見る限りほかのスレッドが触ることはなさそうなのですが確信持てないです。 SetEventとWaitForSingleObjectの間で他のスレッドにスイッチしなければそういうことはおきないですよね? であれば確認のためにはスレッドのスイッチをSetEventとWaitForの間で抑制してあげればいいですよね。 なにか、任意のコードブロックではスレッドスイッチを禁止する方法はないでしょうか
200 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 14:26:18 ] ちょっと確認だが、WaitForSingleObject()の第二パラメータの0ってNoWaitだよな? 単に待てば委員で内科医?
201 名前:デフォルトの名無しさん mailto:sage [2006/01/21(土) 14:42:02 ] >196のままのコードを実行してみたけど、ちゃんと0が帰ってきたよ。