- 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】 【言語】 【実行環境】 【その他突起する事項】
- 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 ]
- >>30msに一度呼ぶと
失敗するような気がする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に影響を与えたくないです。
- 368 名前:デフォルトの名無しさん [2008/01/14(月) 22:15:59 ]
-
【OS】 linux fedora 7 【言語】 C 【実行環境】 えー?何て書けばいいのかな? 【その他突起する事項】 特になし 質問ですが、何故pthread_createの第4引数はvoidでキャストするの? argを入れるんだし。たとえば、整数 2を入れる場合も (void *)2 みたいに渡しますよね。 構造体に渡すと言ってもポインタで渡したら良いだけのような.... そのまま入れたらダメな理由は何ですか? 教えてえろい人
- 369 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:29:32 ]
- なにをやろうとしているかを理解してからやれ、ということ
- 370 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:31:38 ]
- そういう関数作って
そのままいれてみろ
- 371 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:32:38 ]
- >>368
日本語でおkだよ
- 372 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:34:33 ]
- >>368
32bitで済むなら、キャストして無理やり渡したほうが楽ジャン
- 373 名前:デフォルトの名無しさん [2008/01/14(月) 22:35:30 ]
- >>369-370
あ、ありがとう。 理解が足りないかもですね。 (int *)でも良いんじゃないですか?って思うんです。 やってみたけど、ダメだよー なんです。orz
- 374 名前:デフォルトの名無しさん [2008/01/14(月) 22:36:23 ]
- あ、64bit環境 gccです
- 375 名前:368 [2008/01/14(月) 22:37:13 ]
- 373,374も私です。
- 376 名前:デフォルトの名無しさん [2008/01/14(月) 22:39:18 ]
- LP64環境か。なら、(void*)2ULLじゃねーの?
- 377 名前:デフォルトの名無しさん [2008/01/14(月) 22:40:18 ]
- void* argを数値に戻すときは、int i = (int)(unsigned long long)arg;
- 378 名前:368 [2008/01/14(月) 22:47:29 ]
- >376
(void*)2 で動きます。 プリプロセッサがそのように直しているのかも知れません。 >>377 ん? pthread_create(&th , arg2 , arg3, (void *)2); みたいに渡しますが pthread_create(&th , arg2 , arg3, (int *)2); ではダメな理由は何ですか?
- 379 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:47:42 ]
- uint64_tって書けよw
- 380 名前:368 [2008/01/14(月) 22:50:20 ]
- uint64_tもダメでした
キチンとかかず、ごめんなさい
- 381 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:53:52 ]
- >>380
お前だめだわ pthread_create()のmanみて 引数の定義どうなってるか調べたか? そこは何でも受け取れるようにvoid *になってるから そう渡せやって定義に書いてあるだろボケ 東京湾に沈めるぞドあほ
- 382 名前:368 [2008/01/14(月) 22:57:43 ]
- >>381
man見てますよ。 なぜvoidでキャストするの?int*とかでも良いでしょ?ポインタで渡すだけでしょ? ってことなんです。
- 383 名前:368 [2008/01/14(月) 22:59:01 ]
- ポインタで渡す限りintもcharもvoidも関係ないでしょ?って質問です
- 384 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:00:55 ]
- >>382
なんでint *なの? 汎用ポインタならvoid *が判りやすくていいじゃん。 # それとも、qsort()も使ったことがない人?
- 385 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:01:29 ]
- C言語の型って何のためにあるかわかる?
- 386 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:06:28 ]
- 関係ないけどC99では整数⇔ポインタ変換する場合はintptr_tを使った方がよくて、
それやらないと最悪strict aliasingの最適化でバグっちゃうケースがあるらしい。
- 387 名前:368 [2008/01/14(月) 23:08:43 ]
- >>384
>汎用ポインタならvoid * 大抵、そうですね。 昔、voidに型は無い、という話だったけど、void型という型になっていて浦島 状態です。 >>385 話の流れから、メモリ確保の為。 intのサイズは小さく、他に大きなサイズの時困るって事でしょうけど。 今回は、pthread_create(&th , arg2 , arg3, (int *)2); のように、サイズが小さくても、不整合は出ないような... 出るのかな?
- 388 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:13:41 ]
- いや、Cにはvoid型はないけどvoid*型はあるの。
- 389 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:17:11 ]
- void型はあるよ。
void型へのキャストもできるし。
- 390 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:17:48 ]
- >>387
サイズ云々はかんけーねーだろ 8byteの汎用アドレス渡すことに 何一々屁理屈こねてるんだアスペル房?
- 391 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:20:22 ]
- >>368
あるよ
- 392 名前:368 [2008/01/14(月) 23:20:31 ]
- >>390
>385は何のため? >>389 void型って、出来てますよね?
- 393 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:20:42 ]
- >>387
考えがアセンブラだなぁ。 ひょっとして今時オブジェクト指向を理解できてない人?
- 394 名前:368 [2008/01/14(月) 23:22:59 ]
- >>393
確かに gcc -Sのコード見たほうがデバッグ早いです。 オブジェクト指向は、時々する程度です
- 395 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:23:51 ]
- >>392
厳密に型が決まってる言語だから その場合に曖昧さを表現するには C言語の場合、簡単な解決方法は void *で表現すること 理解できないみたいだし四ねw
- 396 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:27:08 ]
- void hoge(void) {
return (void)0; } 規格にも void type とかいう用語は出てくる。
|

|