- 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】 【言語】 【実行環境】 【その他突起する事項】
- 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回
- 512 名前:デフォルトの名無しさん [2008/02/03(日) 11:08:05 ]
- 環境visualstudio2005 vc++
_beginthreadexを使ってメインを合わせて合計3個と100ms毎の割り込みをさせてるんですが、 assert(0)が有効にならない場合があります。マルチスレッドで緊急にプログラムを停止させたい場合は どうすればいいんでしょうか?
- 513 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:18:51 ]
- ExitProcess
- 514 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:33:51 ]
- >>512
WaitoForSingleObjectとSetEventを使う。
- 515 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:06:49 ]
- assert(0)
- 516 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:58:20 ]
- >>514
Waito ?
- 517 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:28:11 ]
- WaitoSinguruObujecuto と SinguruIvento
- 518 名前:SettoIvento ならわかるが... mailto:sage [2008/02/03(日) 21:12:20 ]
- SinguruIvento ?
- 519 名前:514 mailto:sage [2008/02/03(日) 21:19:11 ]
- ゆるしてっ!!
- 520 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 19:47:15 ]
- >>512
俺を使え。全力でとめてやるぜ
- 521 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 14:49:26 ]
- 生成したスレッドから、
ウィンドウハンドルを使用するマクロを使うためにはどうすればいいですかね?
- 522 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 14:54:37 ]
- わかりやすい日本語でお願いします。
- 523 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 18:17:55 ]
- >>521
ウインドウハンドルが欲しいのかな?
- 524 名前:デフォルトの名無しさん [2008/02/11(月) 23:34:04 ]
- Visual Studio.NET 2003で、Win32API、C++のプログラムをしてるんですが、
複数スレッド同時に、クラスのオブジェクトをnewしまくると、 ・HEAP[aaa.exe]: HEAP: Free Heap block 3c04d0 modified at 3c04e0 after it was freed ・0xC0000005: 場所 0xfeeefeee に書き込み中にアクセス違反が発生しました。 。 ・0xC0000005: 場所 0xfeeefeee を読み込み中にアクセス違反が発生しました。 。 などのエラーがでます。 何か回避方法はないでしょうか? newしてるのは同じクラスのオブジェクトですが、 static変数は持っておらず、グローバル変数も共用してません。 共用のものとしてはstatic関数を持ってますが、使ってはいません。
- 525 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:22:37 ]
- > 何か回避方法はないでしょうか?
バグを直す。
- 526 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:41:03 ]
- ランタイムがシングルスレッド用になってんじゃね?
- 527 名前:524 mailto:sage [2008/02/12(火) 00:58:26 ]
- >>525
シンプルな以下のクラスでテストしてみたんですが、 やっぱり同じエラーが出ます。 class TestClass{ public: TestClass(); virtual ~TestClass(); }; TestClass::TestClass(){} TestClass::~TestClass(){} >>526 ランタイムってなんでしょうか? VCで設定するものですか?それとも実行する環境に依存するもの?
- 528 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:01:02 ]
- クラスの定義よりも寧ろ、「newしまくる」方を晒せよ。
- 529 名前:524 mailto:sage [2008/02/12(火) 01:06:18 ]
- >>526
ありがとうございます! VCの設定で、 プロジェクトのプロパティ→C/C++→ランタイムライブラリを、 マルチスレッドデバッグにしたらエラーが出なくなりました。
- 530 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:11:48 ]
- ヤレヤレ
- 531 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:34:51 ]
- >>529
シングルスレッド用でコンパイルが通ったてことはCreatThreadを使ってるのかな?_beginthreadExを使ったほうがいいよ。
- 532 名前:524 mailto:sage [2008/02/13(水) 02:11:46 ]
- >>531
_beginthreadExは知りませんでした。 調べてみます。ありがとう。
- 533 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:20:00 ]
- グローバル変数使う標準Cライブラリ(strtokとか)を使う場合、_beginthreadExじゃないとまずいことになる。
そうじゃないならCreateThreadでも特に問題なかったと思う。
- 534 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:11:17 ]
- >>533
mallocやnewとか、VCランタイムのいろんなものがやばい。 コンパイラベンダでも無い限り、CreateThread使う必要なし。
- 535 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:54:08 ]
- マルチプロセッサ環境でストアバッファのデータを反映させたい場合
pthreadだとmutex使えばいいんでしょうか?
- 536 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 01:38:26 ]
- >>535
同期プリミティブの使用でフラッシュしてくれなかったら、どうにもならない。
- 537 名前:デフォルトの名無しさん [2008/02/14(木) 02:08:24 ]
- >>535
んー、volatileかな。
- 538 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:03:57 ]
- メモリバリア
- 539 名前:535 mailto:sage [2008/02/14(木) 23:26:30 ]
- 恥のかきついでに。。。
フラッシュされるということはmutexのアンロック後に 他のスレッドから同期プリミティブを使用せずにメモリを参照しても mutexがアンロックされた時点までの操作は完了してると見なしていい この解釈は合ってるのかな
- 540 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:55:14 ]
- posixがそれを要求してる、って
d.hatena.ne.jp/yupo5656/20040618/p2 ここらへんに書いてあった。
- 541 名前:535 mailto:sage [2008/02/15(金) 02:19:14 ]
- なるほど。
www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04 ここにある関数を呼び出した時点でメモリが同期されるわけですね ありがとうございました
- 542 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 11:02:56 ]
- >>539
mutexのアンロックで書き込み側プロセッサのキャッシュがメモリと同期されても、 それだけでは読み込み側プロセッサのキャッシュはメモリと同期されないのでは? 読み込み側にも同期プリミティブ(具体的にはmutexのロック)が必要なはず
- 543 名前:535 mailto:sage [2008/02/16(土) 15:34:51 ]
- >>540の"同時アクセスさえ防いでおけばすべてうまく行く"
というのを信用したんですが・・・どっちが正しい?
- 544 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:21:03 ]
- キャッシュと同期オブジェクトは別じゃないのか。
- 545 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:21:28 ]
- 同時アクセスを防ぐ=読み側もmutexなりでロックしにいく
でも読み込みだけならロックいらないよね。volatile最強!
- 546 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:39:51 ]
- >>545
一応マジレスしておくと、volatileでは確実に読めることが保証されない。安全を期するならロックした方が楽。 # 理由については割愛。
- 547 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:41:24 ]
- CPUのマニュアル読むのが一番
- 548 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:42:24 ]
- >>543
読み込み側もmutexをロックしないと、同時アクセスを防げないじゃないか。 まだ書き込み側がmutexをアンロックする前かもしれないのに。
- 549 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:13:07 ]
- pthreadの、pthread_join()とsleep()の関係について質問します。
主系スレッドZにて、子スレッドa, b, cをpthread_create()により作成します。子スレッドa, b, cは一定時間経過後に処理を行います。一定時間経過するのを待機する場合、sleep()を使っています。 主系スレッドZでは、子スレッドa, b, cが終了するのを待つために、pthread_join()を使っています。しかし、子スレッドa, b, cがsleep()で待機しているときを、子スレッドが終了した時と勘違いしているようです。 現在では、子スレッドa, b, cが終了する前に、それぞれが主系スレッドZにsignalを送るようにしています。主系スレッドZでは、signalが来るまで待機としています。 最初にやっていた、pthread_join(), sleep()の組合せの方がスマートだと思うのですが、こちらの方法でうまくやるのは無理なのでしょうか?
|

|