[表示 : 全て 最新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】

【言語】

【実行環境】

【その他突起する事項】

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

449 名前:デフォルトの名無しさん [2008/01/26(土) 21:55:22 ]
Windowsでは、有限バッファ問題(生産者消費者問題)はどう解決するのが良いでしょうか?
www.cs.is.noda.tus.ac.jp/~mune/oop/node16.html

生産者も消費者も単一プロセス内のスレッドで、生産者・消費者はそれぞれ複数いるという
状況です。バッファがfullまたはemptyのときは、pushまたはpopの処理がブロックしてかま
いませんが、バッファ長は1や2ではなくもう少し大きくしたいと思っています。

UNIXだと、条件変数かセマフォを使えば簡単に実装できると思いますが、前者はWindowsには
無く、後者は単一プロセス内の同期として用いるのは効率が悪そうです。

Windowsは、VistaではなくXPを使っています。よろしくおねがいします。




450 名前:デフォルトの名無しさん [2008/01/26(土) 23:22:41 ]
何でもマルチスレッドにしたがるバカw

451 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:32:11 ]
>>449
XPには条件変数は無いから。自分で作る。

452 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:24:29 ]
条件変数って何があれば自作できるんだっけ?

453 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:30:14 ]
Mutex/CriticalSectionとEventと変数でいいんじゃねーの?

454 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:40:01 ]
>>453
おそらくその組み合わせでは条件変数もどきは作れないと思うのだが・・。
でも、もし大丈夫だとされている実装とか、MS推奨の実装を知っていたら教えて。

455 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:00:10 ]
できないと思う理由を書いてくれ。

なんか、条件変数に過大な期待をしてるみたいだから。

456 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:10:01 ]
broadcast考えなきゃ、Auto Reset Eventを
SignalObjectAndWaitで待てば済む話じゃね?

457 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:23:45 ]
>>455
Mutexの開放とEvent待ちをアトミックに行うことができないから。

たとえばここ docs.sun.com/app/docs/doc/819-0390/6n2qp46ef?a=view
の一番下にあるようなコードの、pthread_mutexをCriticalSectionに置き換えて、
pthread_condを自動リセットのEventに置き換えたとすると、

バッファが空の状態で、スレッドAがデータを取り出そうとする
Event待ちの寸前でコンテキストスイッチ
まだバッファが空の状態で、スレッドBがデータを取り出そうとする
Event待ちの寸前でコンテキストスイッチ
スレッドCがデータを投入
スレッドCがSetEvent
スレッドCが再度データを投入
スレッドCがSetEvent
スレッドAがイベント待ちに入り、すぐ戻る
スレッドAがデータ取り出し完了
スレッドBがイベント待ちに入る。データがあるのにイベント待ちから戻れない

となる恐れがない? (CSのEnter/Leaveは省きました)

www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_cond_destroy.3.html の、
> 条件変数はいつでも mutex と結びつけられていなければならない。これは、あるスレッドが条件変数を
> 待とうとしている時に、他のスレッドが、先のスレッドが実際に条件変数に対して待機するその直前に
> 条件を送信する、という競合条件を避けるためである。
を参考にしました。

458 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:30:15 ]
というわけで、producer-consumerのうまいコード例があればお願いします。


459 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:31:34 ]
投入データの個数をセマフォで管理しとけばいいんじゃないかな
データ投入後→セマフォを1上げる
データ取り出し前→セマフォを1下げる(データがない=セマフォが0の場合は投入される=1以上になるまでブロック)



460 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:35:29 ]
>Mutexの開放とEvent待ちをアトミックに行うことができないから。
はいはい。SignalObjectAndWait, SignalObjectAndWait。

461 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:39:35 ]
>>460
んー、この用途に使えるのか。サンクス。調べてみます。

>>459
最悪それでいこうとおもってます。けど460のでいけるならそれがベター。

462 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:40:44 ]
というか、Producer-Consumerなら、スレッドプールつかって
あとは知らぬの半兵衛を決め込めばいいような気がしてきたぞ。
Producer() {
{
CriticalSectionLock csl(cs);
return if list.full?
list.push( somethings )
QueueUserWorkItem( Consumer );
}
}
Consumer(){
{ CriticalSectionLock csl(cs);
workitem = pop();
QueueUserWorkItem(Producer);
}
SomeWork;
}

463 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 01:41:59 ]
>>462
そういうのもあるんですか。そっちも調べてみます。
ありがと。

464 名前:デフォルトの名無しさん [2008/01/27(日) 01:57:33 ]
>>456
ブロードキャストしたい場合は

465 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:08:57 ]
その場合は、根本から考え直しだよね。
APRみたいに、Manual Rese Eventを待つたびに、待ちスレッド変数をインクリメントして
起こされるとデクリメント。自分が最後に起こされたスレッドかどうかを判断して、
ResetEvent発行するとかさ。

466 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:11:42 ]
manual resetにするわけか。めんどくさいね。

467 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:51:01 ]
結論:Windowsはクソ

468 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:00:27 ]
条件変数を作るとして、それに使うWindowsの同期オブジェクトはどれが軽くてお勧めか?


469 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:18:26 ]
CriticalSectionにSignalObjectAndWaitできるの?



470 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:18:47 ]
>>468
Vistaを使う

471 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 16:59:39 ]
>>435
thread pool化した。8thread上げといてそれを、
pthread_cond_wait/signal/broadcast
pthreaf_mutex_lock/unlock
で、ぶん回した。
non thread時の倍ほどがのスピードが、漸くでた。

単純にctreate/joinだけだと、メチャメチャコストが高いのですね。
このときは、non thraed時の8倍ほど時間がかかった。



472 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:19:52 ]
>>468-469
CSが使えないんだとしたらエラく遅くなるよな。
実際のところどうなのか教えてエロい人。

473 名前:472 mailto:sage [2008/01/27(日) 18:24:54 ]
www.cs.wustl.edu/~schmidt/win32-cv-1.html の3章に実装例があった。
どれも大変な事になっているな。たぶん、pthread_cond_broadcast()を実現しようとしているからだと思うが。


474 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:08:28 ]
VS2005、C++でWin32ウィンドウプログラムを作成しています。
キューの中身が空の間、スレッドを待機させたいのですが、while(que.empty())
{
Sleep(0);
}
とすると、CPUはぶんまわされるわ、スレッド終了フラグも受け取れないわで困っています。
キューにデータが入った瞬間にスレッドが回りはじめ、かつ終了フラグも受け取るためにはどうすればよいのでしょうか?
初歩的な質問ですみませんがよろしくお願いします。

475 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:29:07 ]
釣り?

476 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 22:12:47 ]
いえ、釣りではないのですが…
もう少し調べてみます。
それでも分からなければ初心者スレに行きます。
スレ汚し失礼しました

477 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 22:51:27 ]
とりあえず、セマフォを使ってみよう。

478 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 22:54:49 ]
というか、今までの話題がまさにそのProducer/Consumerパターンについてなわけだが

479 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:08:21 ]
>>449-
.NETならこれ
msdn.microsoft.com/msdnmag/issues/07/05/CLRInsideOut/default.aspx?loc=jp
Vistaならこの記事がおすすめ。
msdn.microsoft.com/msdnmag/issues/07/06/Concurrency/default.aspx?loc=jp



480 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:09:22 ]
>>479
C++でXPなんです・・

481 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:08:54 ]
つうか、セマフォ使えや、カス

482 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:20:54 ]
メータードセクションだろ普通

483 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:21:26 ]
>>481
誰にいってんの?


484 名前:デフォルトの名無しさん [2008/01/28(月) 01:23:40 ]
>>482
へぇ。そんなのあるんだ。プロセス間でも使えて、一定回数はカーネルに落ちないでspin?


485 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 02:31:00 ]
全部ホシュするなら、全部ヤッパ明渡せヤゴラ、でOK

486 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 07:52:58 ]
?

487 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 09:51:29 ]
VMwareでLinux上げてpthread使えば解決

488 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 10:42:06 ]
queueに要素があるかは、>>477,>>481の通りセマフォでやればいいんじゃない?
増減するリソースを管理するんだからちょうどいいでしょ。
フラグの変更はイベントにでもして一緒に待つか、queueに終了って言うなにかを投げ込めば?

489 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:01:56 ]
Linux野郎なんでWindowsには全く疎い俺参上!

Windowsの独自スレッドだけでpthreadはないの?

あと、pthreadとWindowsスレッドを比較した利点・欠点
がまとめてあるHPとないでしょうか?



490 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:46:19 ]
>>484
スピンで待たせるなら、プロセス内専用だけどWindowにもInitializeCriticalSectionAndSpinCountなんてものもあるよ。

491 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:07:07 ]
メータードセクションは、Windowsの話だけど・・・

492 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:27:19 ]
CriticalSectionがspinなのはわかってるよ

493 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:34:26 ]
>>489
Linuxにも疎そうだな

494 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 09:57:59 ]
どうしてもpthreadがいいなら、pthreads for Win32があるでしょ。
以前mingwでつかってたよ。VCでも使えたはず。

495 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:58:59 ]
下のようなクラスを作って、Monitorでのロックと比較してみた。
EnterWithContextSwitchで、ロックがほとんどかち合わないで誤差の範囲で軽く、ロックが頻繁な場合だと
明らかに遅くなる。Enterは確実に遅い。

class SpinLock {
volatile int _isEntered;
public void Enter() { while (Interlocked.CompareExchange(ref _isEntered, 1, 0) != 0) { }}
public void EnterWithContextSwitch() {while (Interlocked.CompareExchange(ref _isEntered, 1, 0) != 0) {Thread.Sleep(0);}}
public void Exit() {_isEntered = 0;}
}
//試したのはこんな感じ 各スレッドで
for (int i = 0; i < _loopCount; i++) {
thp.LockDeleg(thp);//ここでLockして
DoWork(_jobTime);//ここで指定時間処理して
thp.UnLockDeleg(thp);//ここでUnlock
}
対象のロックはmontor,SpinLockともども複数生成して、ロックするときにランダムでロック対象を決めるようにした。生成するロック数も多い場合、少ない場合色々試してみた。

環境はXP Sp2 C# .NET2.0 DualCoreのアスロン何たら。
テスト中はCPUを使い切る場合もあれば各CPUが70%ぐらいで推移する場合もあり。どちらのロックでそうなるかは不明。多分SpinLock。
参考URL
msdn.microsoft.com/msdnmag/issues/05/10/MemoryModels/

何か間違ってる?ついでにおまいらのマルチスレッドに関する考え方、使い方を教えてくれ。
教えてエロイ人


496 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:13:34 ]
何がしたいのこれ?


497 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:26:19 ]
.netのモニターオブジェクトと自前スピンロックの性能評価?

498 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:42:28 ]
具体的に何を計りたいのかよくわからん。

ついでについては、ロックがかち合う可能性を下げるように設計する。

499 名前:495 mailto:sage [2008/01/29(火) 18:54:29 ]
違う回線よりすいません。
説明不足で申し訳ないです。
言われるとおり、自作スピンロックでどれだけロックが軽くなるかの調査です。
いくつかの記事で、SpinLockでのcpu消費の方が、コンテキスとスイッチより軽いと言っていたので試してみました。
結果が記事と逆になってしまったので自分のコードが何かおかしかったのかと。




500 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:10:11 ]
スピンロックはマルチプロセッサじゃないと効果無いんじゃないか?
スピンしてる間にロックが外れれば、カーネルに落ちなくて済むじゃん

501 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:27:06 ]
>環境はXP Sp2 C# .NET2.0 DualCoreのアスロン何たら。
って書いてあるから、2つあるんでそ。

502 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:31:05 ]
あ、ほんとだ。失敬失敬。


503 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:33:43 ]
単純なサンプルで重い、軽い、と早い、遅いを同列に語っても意味無いかと。

あとSleep(0)の分解能なんてろくに無いんだから
いちいちロックされてるたびに呼んでたら無駄に待たされる。
ただ、一般的には、他の誰かが処理してるからCPU時間を明け渡してあげることで
いち早くロックを取得できる可能性をあげる意味でSleepを使う

Sleep(0)の分解能調べて見て、中のジョブがどれぐらい時間かかってるか
調べて見れば、あなたのいう軽いとか遅いとかがより深く理解できると思う。

Win32だったらCriticalSectionで一発だったんだが
.netはLockかInterlockしか無いのかな

504 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:33:52 ]
public void EnterWithContextSwitch() {while (Interlocked.CompareExchange(ref _isEntered, 1, 0) != 0) {Thread.Sleep(0);}}
というか、これ "Sleep(0)" が原因でねーの。他にするタスクがないとき、CPU休まないじゃん。

505 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:06:30 ]
.NETのロックは元々クリティカルセクションだよ。

506 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:15:59 ]
単純なスピンロックなんざそもそも間の処理が極めて短時間で
競合なんてまず滅多に起こらん場合にしか向かん。

507 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:27:30 ]
どうもインタロック操作が極端に軽いと勘違いしてる奴や記事が多いな。
.NETなんて単純にロックでもそう大差はないのに。


508 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:39:37 ]
ああこれは件のMSDNの記事の事じゃないので念のため。


509 名前:495 mailto:sage [2008/01/29(火) 21:59:01 ]
>>506
そのようだ。
>>507
極端に軽いと勘違いしてた。

今は反省している




510 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 13:04:30 ]
>>21によれば、.netの機能をそのまま使えば良いんじゃないか?

511 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:09:40 ]
うんそう。
あえてスピンロックにするのはインタロック操作1回分までも節約したいとき。
2回→1回







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

前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