[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 09:53 / Filesize : 193 KB / Number-of Response : 799
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

マルチスレッドプログラミング相談室 その6



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】

【言語】

【実行環境】

【その他突起する事項】

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 とかいう用語は出てくる。



397 名前:デフォルトの名無しさん [2008/01/14(月) 23:27:48 ]
>>395
理解しますが
>簡単な解決方法void *で表現
ならば、他に方法は有るのですか?無いのですか?

398 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:31:34 ]
値は同じでも意味が違うものってあるでしょ。
C言語でいうなら同じ0でも、数学の0と、ポインタのNULLでは意味が違う。
それらを区別するために型という概念がある。
で型があることでコンパイル時に型チェックが可能となって意味の混同が起こってないかを調べられるわけ。

399 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:35:53 ]
引数に int* ってあるなら、それは32bitの値へのアドレスを渡すということではなくて
intの意味を持ったものへのポインタを渡すって理解すべきなの。
だからそこへとある構造体へのポインタを渡すなんてのは設計も使い方も分裂症気味におかしいわけ。

400 名前:368 [2008/01/14(月) 23:43:00 ]
>>398,399
なるへそ。分かりました。

けど、別の疑問が、**(ポインタのポインタ)で渡したら型の意味もないような

401 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:45:46 ]
どうでもいいけど、(void *)2はともかく、(int *)2はきもい

402 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:51:41 ]
*が何個付こうが話は同じ

403 名前:368 [2008/01/14(月) 23:59:01 ]
了解。
皆さんありがとうーーーーー。
関数作ってみようか考えていましたが、しなくて良いみたいですね

404 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:31:43 ]
やけにスレが伸びてるなと思ったらC言語講習会かよ・・・

405 名前:デフォルトの名無しさん [2008/01/15(火) 00:34:54 ]
じゃ、pthread_atfork関係でもする?


406 名前:デフォルトの名無しさん [2008/01/15(火) 00:37:40 ]
pthread_yield()で頼む。
NPだけど。



407 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:44:56 ]
なんで?

408 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 01:36:25 ]
スレッドで thread1 thread2の2つを走らせている場合
正常狩猟、異常終了両方で2つのthread1 thread2とも同時に終了させて
再度、起動したいのですが、どのようにして終了させたら安全ですか?

pthread_cancel(),ptrhread_join,pthread_exit


409 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 02:31:14 ]
>>408
スレッドを抜ける

410 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 04:51:33 ]
>>409
そりゃそうだ。
cancel-join
exit-joinが良いのかな?
どうしたら良いかな?
mutexは無しです

411 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 11:27:19 ]
thread10個起動して、全部待ちたいときはどうすればいいの?

412 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 11:33:00 ]
forでjoin回せば。Win32なら64個までの限定だけどWaitForMultipleObjectsとかあるけど

413 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 11:37:22 ]
>>411
pthread_barrier_wait()

414 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:02:03 ]
あざーす。

415 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:19:01 ]
すみません
スレッドでがんがん動く関数がるけど、この関数は起動字にも動いて処理します。
起動字はスレッド起こしてないんだけどpthread_関係が入っている関数を使っていいの?
具体的にはpthread_atporkです

416 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:58:36 ]
誤時がおおおいな



417 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 01:38:20 ]
あっとぽーくなんてマニアックな関数、何に使うんだか。

418 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 01:50:30 ]
deadbeefと関連がありそうだな
なさそうでもあるな

419 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:47:59 ]
>>413

411じゃないけど、pthread_barrier_wait() はlinuxでは無いようです。
どうようの効果を期待できる関数は何ですか?あるいは、その組み合わせは?
教えてちゃんですまそん

420 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:57:18 ]
>>419
あんたの使ってるディストリビューションが古いだけ。
もっと新しいglibcを積んでるやつを使え。

421 名前:デフォルトの名無しさん [2008/01/19(土) 00:46:44 ]
LinuxThreadsの頃からあったと思うんだがな。。。
何使ってんだ??

422 名前:デフォルトの名無しさん [2008/01/19(土) 00:48:06 ]
>>419
ほんとにないなら、mutexと条件変数の組み合わせで実現できるけど、結構難しいよ。
NPTLのpthread_barrier_waitの実装を読んで、真似するのが良いと思う。


423 名前:419 mailto:sage [2008/01/19(土) 02:35:01 ]
>>420,421
cg-linuxていうらしいです。manで無かったんです
かえたらダメだと思います。多分。
kernel=2.4.17?みたいなことします。

pthread.hを見て本当にないか見てみます。

>>422
そんなドキュメントあるんですか、本当になかったら探します。

424 名前:デフォルトの名無しさん [2008/01/19(土) 06:58:09 ]

私が小学生の頃、
日本中でノストラダムスの予言が大流行していた。
「1999年の7月に人類は滅亡する!」
という例のお騒がせ終末予言である。

大人になって社会に出て働きだして、
あくせくと忙しく日々を過ごしながら、
1999年は、
ありふれた日常の中であっさりと過ぎていった。
人類は滅ばなかった。

これからここで、
1999年に起こるかもしれなかった人類の壊滅的破局を、
誰にも知られずにこっそりと回避させた人たちがいた...
という設定で、
荒唐無稽なストーリーを描いてみたい。
無論、100%完全なフィクションである。

www5.diary.ne.jp/logdisp.cgi?user=532063&log=200705


425 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:09:05 ]
>>423
www.google.co.jp/codesearch?hl=ja&lr=&q=glibc-2.5%2Fnptl%2Fsysdeps%2Fpthread%2Fpthread_barrier_wait.c
とかのことね。

426 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 02:29:53 ]
>>425
くーーー、64bitなんですーーー
探してみますーーーー
こんなサービスもあっ短だメモメモ



427 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 05:25:11 ]
bit数関係あんの?

428 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 14:35:26 ]
cglinuxってキャリアグレード?

429 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:25:00 ]
そうだろうね。カーネルバージョン見ると MontaVista っぽい。
だとするなら、サポートしてるかどうかはもんたに聞いた方が良いね。

というか、419が欲しい機能は本当にpthread_barrier_waitで合ってるんだよね?
>>411 を素直に読むと >>412 で FA だと思うんだが。
(まあ419がちゃんとわかってて聞いてるなら余計なお世話だけど)


430 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:23:46 ]
matrix * matrixをpthread_createとpthraed_joinだけで、
ぶん回してみたけど(quad core)普通にthread無しで
やるほうがはるかに早かった。

pthread_createのコストが高いのかなあ?
threadを最初に作っておいてpthraed_cond_wait待っておいてスレッドを使いまわす
方式で再実装してみる。

431 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:55:51 ]
スレッド数4にしてる?

432 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 16:25:48 ]
している/いろいろやってみだ。
4,10,,12,16,32

32だと、たまーにtopでみていると2000%とかになっていた。
それでも、遅い。

433 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 16:27:54 ]
×みだ
○みた

あと、スレッド数8が抜けていた。

434 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:28:15 ]
コアが4個なんだからそれより多くしてもほとんどメリットはないだろ

435 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:31:44 ]
プロセス生成に比べるとマシってだけで、
スレッドの作成(と終了)はそれなりにコスト高いよ。

436 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:36:38 ]
並列化効率とかアムダールの法則とかでググれ



437 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:34:00 ]
DualCoreXeon*2で実験した限りでは、core辺り処理量は(殆ど)変わらなかったけどなぁ。
分割の仕方が悪いんで内科医?

438 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 06:20:13 ]
>>436
そんなの、スレッド本の第一章に書いてあるだろ。


439 名前:デフォルトの名無しさん [2008/01/26(土) 13:54:13 ]
Windowsで
4つのスレッドを開始させ、
一つのスレッドが終了次第、
ほかのスレッドも全て終了させる方法ってありますか?

440 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:02:01 ]
>>439
そのように作ればそうなります。

441 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:07:17 ]
>>440
すみません。
私の聞き方が曖昧でした。
手段を教えて下さい。

442 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:31:08 ]
終了すると終了させるは微妙だが大きな違い

443 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:37:11 ]
>>439
4人の子供のうち、誰か一人でも死んだという通知が来たなら、他の三人に死亡要求を掛ければよろしいかと。
子供が死亡要求を聞き届けてくれない仕様ならば、殺すしかありませんが。
いずれにしても、APIレベルで実装したいならAPIスレ、.Netでやりたいなら.Netスレ、そうでないならVSスレなり
初心者スレなり適当にどうぞ。

444 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:41:02 ]
WaitForMultipleObjectsで4つのスレッドを待てば、どれか一つのスレッドが
終了したかが判るから、あとは終了イベントたてるなり(スレッドが参照していることが条件だけど)、
TerminateThreadするなり(非推奨)、好きなようにやれば。

445 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:54:02 ]
マルチスレッド使って、CPU負荷分担みたいなことってできる?
2つのまったく動作が同じスレッド作って、2つのCPUリソースに処理を振り分けるとか?


446 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 15:25:58 ]
できるできないで言えば普通できるに決まっとろう。



447 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 16:19:18 ]
なにか共通で使うリソースがあって、同時にそれを使えない場合は、
如何に競合を回避するか考えないと、相手のリソース解放を待つのとかで、
同時に動作できる時間が減っちゃう。
CPU1: *-*-*    ***---
CPU2: -*-*- とか ---***
こんなのになったら意味無いし。

448 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 18:09:47 ]
無駄だけどセマフォしかないわ、全部持つか、一個なら諦めろw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<193KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef