1 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:35:32 ] マルチスレッドプログラミングについて語るスレ。 その1 pc3.2ch.net/tech/kako/997/997345868.html その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/ その4 pc8.2ch.net/test/read.cgi/tech/1130984585/ その5 pc11.2ch.net/test/read.cgi/tech/1157814833/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他突起する事項】
267 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 01:59:52 ] スレッドの呼び出しコストってどうやってはかるの? 組込み用でmutexとかの関数の呼び出しコスト一覧 表作り単位んだけどどうしたらいいん?
268 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:27:13 ] >スレッドの呼び出しコスト 具体的にどういう意味と受け取ったらよいのだ?
269 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:38:38 ] 適当なタイマーで挟んではかr
270 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 08:11:41 ] >>265 ttp://developers.sun.com/solaris/articles/stl-new.html Standard Library, STL and Thread Safety Atomic updates for reference counting ttp://www.sparc.com/standards/SPARCV9.pdf J Programming With the Memory Modelsにいろいろ J.6 Spin Locks(Example 8―Lock and Unlock Using CAS) J.11 Fetch_and_Add(Example 15―Fetch and Add Using CAS) J.12 Barrier Synchronization(Example 17―Barrier Synchronization Using CAS) J.13 Linked List Insertion and Deletion(Example 18―List Insertion and Removal)
271 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:27:41 ] >>270 ktkr
272 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 08:14:03 ] C++でのマルチスレッドに関する質問です class sample{ private: int i; HANDLE hEvent; public: sample(){ hEvent = CreateEvent(NULL, TRUE, TRUE, L"sample"); } ~sample(){ CloseHandle(hEvent); } void fSetdate(int _i){ WaitForSingleObject(hEvent, INFINITE); ResetEvent(hEvent);//ロック開始 this->i = _i; SetEvent(hEvent);//ロック解除 } int fGetdate(){ WaitForSingleObject(hEvent, INFINITE); ResetEvent(hEvent);//ロック開始 int _i = this->i; SetEvent(hEvent);//ロック解除 return _i; } }
273 名前:272の続き mailto:sage [2007/10/25(木) 08:17:17 ] 上記のクラスをひとつだけインスタンス化して、 複数のスレッドがそれを呼び出した場合、データの同期化は成立しますか?
274 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 09:08:53 ] 何が死体のこれ?
275 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 09:18:17 ] 別々のスレッドがfSetdateのResetEventに同時に到達した場合どうすんの?
276 名前:272の続き mailto:sage [2007/10/25(木) 09:39:20 ] あべし クラス内部でイベントによってデータの同期をとろうと思ったんですよー。
277 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 10:03:47 ] 何でCriticalSection使わんの?
278 名前:272 mailto:sage [2007/10/25(木) 10:27:32 ] >>277 イベントと違いがわからんっす
279 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:26:21 ] イベントを理解しとらんからだろ。 それで同期ってなにが目的なのよ?
280 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:44:13 ] 正解を書きたいけど、それをコピペして終了されると悲しいので ここは是非MSDNのドキュメントを読むなりして頑張って欲しい。
281 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 13:10:53 ] >>278 イベントとクリティカルセクションがどう違うかなんて、腐るほど説明があるから いちいち書きたくないが、簡単に言うと ・イベント 遅い プロセス間の同期に使える ・クリティカルセクション 速い&簡単 スレッド間の同期にしか使えない あと、その目的でイベントを使うなら自動リセットイベントを使う。 そのコードだと275の懸念していることが、起こるかもしれないという レベルではなく、確実に起こる。
282 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 13:20:09 ] 何をどう同期したいのか分からんから起こっても変わらん気がするw
283 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 15:43:08 ] >>281 初心者に、あまり適当なこと教えるなよ。 それはどちらかというと、MutexとCRITICAL_SECTIONの違いだろ。 EventとCRITICAL_SECTIONの違い、あるいはpthreadにおけるcondとmutexの違いは 同期(実行をコントロールする)か排他(データを保護する)か。
284 名前:272 mailto:sage [2007/10/25(木) 18:24:31 ] みなさんどうもっす。 同期について根本的に勘違いしてました。 データの保護ではCriticalSectionを使うのですね。 でもEnterCriticalSection()が同時に 実行されるということはありませんか?
285 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 18:31:20 ] そんな質問が出るってことは まだCriticalSectionについてググってすらいないようだな…。
286 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 20:26:43 ] >>284 >でもEnterCriticalSection()が同時に >実行されるということはありませんか? わらった。 そりゃ同時に実行されるさ。そのためのものだもん。
287 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 14:38:05 ] 質問。 今のところはlinuxのpthreadのみを使っていますが、 なるべく一般のスレッドで使えるようにしたいと考えています。 複数のスレッド(X,Y,...)があってそれぞれが独立に動き、 読み込みアクセスrdと書き込みアクセスwrをします。 排他の条件は 1) XのrdとYのrd =>排他しない 2) XのrdとYのwr =>排他する 3) XのwrとYのwr =>排他する 4) XのwrとXのrd => 排他しない(wrの中からrdすることがあるので) となっています。 自力で考えた手法はrwlockを使っています。 4)の条件を満たすためにrでロックする際はtryrdlock()して ・返り値がEDEADLKなら自スレッドがwrlockしているとみなしてロックせずに通す ・それ以外なら他スレッドがwrlockしているとみなして待機する としています。 この手法で移植性は十分でしょうか?
288 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 14:58:54 ] 移植性っても、どの程度を考えてるかによるけど、例えば Windows には reader writer lock がそもそもなかったような…
289 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:10:34 ] visutaから追加された。
290 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:15:25 ] びじゅた?
291 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:25:14 ] 一般のスレッドって何だよ
292 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:38:23 ] なんで4)でrdロックする必要あるの?
293 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:47:18 ] ぴゅうた以来 プログラムかいてねーから 鈍ってしまって困った
294 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 09:52:33 ] 返答ありがとうございます。 >>288 Windowsのスレッドは触ったことがなく、rwlockがないことを知りませんでした。 >>292 rwlockの状態を知るためにtrylock()しています。 pthreadに現在の状態を問い合わせる関数が見付からなかったのでこのようにしました。 (一般には現在の状態を問い合わせても 次のステップまでその状態が持続するとは限らないことは承知しています) mutexからrwlockを実装するというのを本で読んだことがあるので それを参考に実装してみます。
295 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 00:30:34 ] Linuxでpthreadを使用しているのですが valgrindで実行するとfopenとfcloseの箇所で以下のエラーが大量に出ます。 ==25540== Possible data race reading variable at 0x1D52238C ==25540== at 0x674CB5: _IO_un_link_internal (in /lib/tls/libc-2.3.4.so) ==25540== by 0x668A5D: _IO_fclose@@GLIBC_2.1 (in /lib/tls/libc-2.3.4.so) ==25540== Address 0x1D52238C is 52 bytes inside a block of size 352 alloc'd by thread 1 ==25540== at 0x1D4A8090: malloc (vg_replace_malloc.c:131) ==25540== by 0x66935E: __fopen_internal (in /lib/tls/libc-2.3.4.so) ==25540== by 0x66941C: _IO_fopen@@GLIBC_2.1 (in /lib/tls/libc-2.3.4.so) Webで調べるとglibcはすべてスレッドセーフだと書かれているのですが 同期とかしないといけないのでしょうか? 詳しいかた教えてください。
296 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:10:57 ] helgrind使ってるって事? あとさ、glibc-2.3.4って偉い古いな。
297 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:13:19 ] 関数がスレッドセーフであるかと同期が必要かは別問題
298 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:40:30 ] >>295 同じdescriptorを同時にopen/closeしにいったらまずいわな。歯痛汁。
299 名前:295 mailto:sage [2007/11/15(木) 12:29:07 ] >>296 CentOS4.5でhelgrind(valgrindは2.2)です。 yumしてみましたがglibcのバージョンは2.3.4が最新でした。 >>297 すみません、語弊がありました。 glibcがスレッドセーフでないならなにか回避策がないと スレッドでは使用できなくなってしまうので一般的にはどうするのかなと。 >>298 すみません、説明が足りませんでした。 ファイルのオープン、リード、クローズは すべて同一のスレッド内で行っています。
300 名前:295 mailto:sage [2007/11/15(木) 12:30:35 ] みなさん遅くにありがとうございます。 もう少し調べてみます。
301 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:26:00 ] valgrind3.3まで待ったら?
302 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 00:08:19 ] 同僚に嫌がらせするだけのために valgrind --tool=erogrindって オプション作って オワタって表示されるようにしたんだけど さっきめっさ怒られたw
303 名前:デフォルトの名無しさん [2007/11/17(土) 20:28:57 ] 思いつきだが、最新のvalgrindのsupression fileを使ってhelgrindしてみるのはどうだろうか。
304 名前:デフォルトの名無しさん [2007/12/18(火) 09:21:07 ] Linuxを使った組込機器の開発に、NPTLではなくLinuxThreadsというのを使うことになりました。 これは聞くところによると、あまりOSに頼らずに実装されたスレッドライブラリということですが、 たとえばpthread_mutex_lock関数はどのように実装されているのでしょうか?OSのシステムコール を呼ばない形で実装されているのでしょうか? ソース嫁かもしれませんが、詳しい方いらっしゃいませんか?
305 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 09:55:20 ] www.linux.or.jp/JM/html/LDP_man-pages/man7/pthreads.7.html
306 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 11:18:26 ] アトミックオペレーションができるインストラクションをインラインアセンブラーで記述する事で実現している
307 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:23:24 ] しばらくspinしてもロック獲得できなかったらRTシグナル街に入るんだっけ? それはともかく、俺は完全ユーザ空間な1:Nスレッドの実装方法、特にどうスレッドをスケジュールするのかがさっぱりわからない。
308 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:48:30 ] green thread
309 名前:デフォルトの名無しさん [2007/12/18(火) 21:49:42 ] >>308 解説よろ
310 名前:デフォルトの名無しさん [2007/12/19(水) 23:15:10 ] pthread規格で、 ・端末で^CしたときのSIGINTシグナルは、どのスレッドに届くのか(あるいは全スレッドに届くのか) ・メインスレッドがexit()するとその他のスレッドは終了するのか ・メインでないスレッドがexit()したときはどうか がわかりません。規格上どうなっているか、あるいは最近のLinuxでどうなるか教えていただけないでしょうか? 手元にSolarisしかなくて困ってます。 あ、main関数を実行したスレッドを勝手にメインスレッドと呼びました。
311 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:39:05 ] >>310 プロセス宛てのシグナルは、どれか一つのスレッドに届く。どれに届く かは決められていないので、受け取りたいスレッド以外ではそのシグナ ルをブロックするようにしておく。 exit()でプロセスが終了する。スレッドは関係ないはず。
312 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:39:21 ] スレッドセーフレベルの統一的な呼称ってあります? 引数がスレッドセーフじゃないとか条件付の状態とかあるよね。
313 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 11:07:35 ] シグナル受け専用スレッドって作る?
314 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:32:00 ] waitして何かあったらコールバックしてる。
315 名前:デフォルトの名無しさん [2007/12/23(日) 19:58:10 ] pthread_cond_wait()でspurious wakeupが起こるのって具体的にはどういうときでしょうか? どういう順番で、各スレッドの実行や切り替えが起こった場合でしょうか?
316 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:05:52 ] .NETのMonitor.Waitでもおこるかどうか知ってる人いませんか?
317 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:14:35 ] 3000円ちらつかせると 解ってくるかもしれないw
318 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:48:11 ] >>315 ,316 マルチスレッドプログラムは基本的に非同期なので、何がおきても対応できるように冗長に作っておいたほうがいいと思う。
319 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 23:44:58 ] >>318 何も言ってないのと同じw 「基本的に」「何がおきても」「冗長に」って.....いかにも何も判ってない奴が使いそうなワードを連発されてもなぁ。
320 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:04:00 ] 代わりに君が内容の有る事を言ってもいいんだよ
321 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:20:32 ] そんなものが書けると思っている段階でダメダメ
322 名前:319 mailto:sage [2008/01/02(水) 00:24:53 ] >>315 >>320 まず、cond_waitしているスレッドがシグナルを受信し、cond_waitがEINTRで戻った場合。 もうひとつ、これをspurious wakeupと呼ぶかは語の定義によるが、cond_wait中のスレッドがwakeさせられた際、 mutexをlockする前に別のスレッドがmutexを先にlockし、条件を偽にした場合。 どちらも、POSIXでは起きてよいことになっているけど、本当に起こり得るかどうかは実装による。 >>316 知らん
323 名前:デフォルトの名無しさん [2008/01/02(水) 00:34:36 ] >>316 research.microsoft.com/~birrell/papers/ThreadsCSharp.pdf これの5.2
324 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:38:35 ] >>295 去年の12月にhelgrindの新しいの出たらしいよ。
325 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 09:46:44 ] >>295 複数のスレッドからアクセスすれば "Possible" data race になるのは当然なような 俺はそういう作り方はしない
326 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 01:33:19 ] >>295 ファイル操作用のスレッドかなにかに 終了通知送って閉じさせろよ 資源の管理はよほどの事情ないかぎり 一括にしろ いいなわかったか?反論するなら お前の家にそれは末恐ろしいものを いくつかぶちまけて逃走するからな? いいかわかったか?
327 名前:デフォルトの名無しさん [2008/01/06(日) 23:38:52 ] C言語でマルチスレッドに挑戦していまして、 複数の子スレッドを途中停止させ、また再開できるような状態にしたいのですが、 いい方法はありませんか?
328 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 23:41:50 ] >>327 Cでどうやるのか忘れたけど、イベントなりセマフォなりミューテックスなりで待たせるのが 一般的。
329 名前:デフォルトの名無しさん [2008/01/06(日) 23:47:25 ] >>327 pthread_barrier_wait() とエスパー。
330 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 02:21:07 ] >>327 C言語にスレッドという概念はない。 環境書かないとわかんないよ。
331 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 09:38:37 ] WindowsXPです。
332 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 10:22:58 ] >>331 Winなら、MFC使ってUIスレッド作って、メッセージで動かすのが簡単だが。 Win32APIだけでやりたかったら、↓のマルチスレッドの章を一通り読んでみ。87章から。 www.kumei.ne.jp/c_lang/index_sdk.html WaitForSingleObject() あたりを使うことになるだろうな。89章から先に載ってる。
333 名前:デフォルトの名無しさん [2008/01/07(月) 11:51:27 ] レスありがとうございます。 調べましたところ、 WaitForSingleObjectはスレッドがシグナル状態になるまで待ち合わせを行うものだとありましたが、 これをどのように使えばスレッドを途中停止出来るのでしょうか?
334 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 11:55:26 ] >>333 スレッドで考えるんじゃなくて二人以上の作業者による連携プレーを考えろ で、ひんとはミューテックスオブジェクトかセマフォオブジェクト
335 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 13:15:18 ] スレッドを止めたいって書いてあるのが読めないのか? 答えられないならレスするんじゃねぇよ。
336 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 13:25:13 ] >>335 をつつくとSuspendThread使えとか言い出しそうだな(笑
337 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 13:30:41 ] 「いい方法はありません」ってことで。
338 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:08:45 ] >WaitForSingleObjectはスレッドがシグナル状態になるまで待ち合わせを行うものだとありましたが、 調べが足りてないね。
339 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:13:49 ] Windowsなんて使ってるやつは馬鹿です
340 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:21:29 ] >>339 なぜですか?
341 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:32:15 ] 「ATOK使うやつは馬鹿」と何かの関係が!?
342 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:33:09 ] ここは良心的な釣堀か。入れ食いだな。
343 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:44:14 ] なぜ止めたいかを説明してケロ。 他のスレッドを強制的に止めたいのか、何かを待ちたいのか。 スレッドを止める方法はいろいろあるので、目的を説明して。
344 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 03:46:58 ] 個人中傷スレだったので・・・
345 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:01:16 ] スレッドじゃないけど fork()類って実行間隔って あまりにも短いとダメなのかな?
346 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:11:33 ] >>345 なんで?
347 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:21:25 ] >>30 msに一度呼ぶと 失敗するような気がするw
348 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:27:36 ] >>347 それシステム資源食い潰してるしwww
349 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:28:09 ] そもそもなんでそんなにfork()しなきゃならんのかと。 設計から見直せ。
350 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:31:43 ] >>349 fork()する回数は10回なのですが なるべく速くfork()を10回完了させたいだけですw
351 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:33:43 ] OSくらいさらせや
352 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:34:37 ] >>350 exec
353 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:43:39 ] ちなみにSolaris 10 で のことです
354 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 17:20:58 ] errno は?
355 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 17:30:49 ] ダメって何がダメだったのか・・・
356 名前:デフォルトの名無しさん [2008/01/12(土) 22:41:41 ] >>350 preforkしろ
357 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 08:22:40 ] アセンブリでマルチスレッド これ最速
358 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:26:49 ] 同期とかも全部asmでやるの?
359 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 19:16:03 ] spin lock
360 名前:デフォルトの名無しさん [2008/01/13(日) 20:38:31 ] >>359 fairnessの問題はどうする?
361 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:48:04 ] fairlock
362 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:00:45 ] 【OS】Windows Vista Ultimate 【言語】C++ 【実行環境】Visual C++ 2005 Professional, C++ Boost Library 1.34.1 【その他突起する事項】なし bool shouldExit_; istream &is; void handler() { while(!shouldExit_) { string str; is >> str; } } handler関数がthreadのコールバック関数になるのですが この関数を終了させようとしてshouldExit_にtrueを代入しても 入力が内場合、入力演算子を使用しているところでずっと待機してしまいます。 このスレッドを安全に終了させる方法はないでしょうか?
363 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:06:54 ] >>362 volatile bool shouldExit_=false;
364 名前:306 mailto:sage [2008/01/14(月) 18:08:38 ] すみません。 漏れていました。 本来のコードには書いてあるのですが、shouldExit_を評価するところまで処理を持って行けません・・・。
365 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:09:13 ] >>363 をいをい w is>>str; でブロックされてるんだからこの場合フラグは関係ないだろ。 とりあえず入力をタイムアウト付きでやるか(C++でどうやるかは知らん)、 可能なら入力ストリームをクローズしてしまえ。
366 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:51:35 ] 入力を待つけどキャンセルとか強制終了出来るようにしたいんだろ?
367 名前:361 mailto:sage [2008/01/14(月) 19:55:45 ] >>365 istreamの実態はネットワークなので まさにその方法でうまくいきました。 ありがとうございます。 >>366 もしそれができればそうしたいです。 なるべくstreamに影響を与えたくないです。