- 1 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 11:23:05 ]
- マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/test/read.cgi/tech/997345868/ その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/
- 496 名前:デフォルトの名無しさん mailto:sage [2006/06/08(木) 18:36:22 ]
- タスク間のデータ参照が多いプログラムと少ないプログラムでは、どちらが「一般的」ですか?
- 497 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 01:47:28 ]
- volatileで回避できますか?
- 498 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 04:22:44 ]
- volatileとstaticで8割方回避できます!
- 499 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 08:47:58 ]
- なにをだ。
- 500 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 10:14:15 ]
- mutexとvolatileでは一般的にどちらが効率的ですか?
- 501 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 12:19:02 ]
- コーディング効率か
コードの効率か で回答が変わってくる可能性がある
- 502 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 12:24:23 ]
- volatileはLockFreeで高速だが、アトミック操作に限定されるので、
一変数ならともかく、全体の整合性がどういう言い出すとプログラムは とっても面倒だし、バグがあるかないかの検証も面倒くさい
- 503 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 12:54:08 ]
- ( ゚д゚)ポカーン
- 504 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 14:14:06 ]
- >>501-502 がマジレスである可能性を想像し、背筋が凍った。
- 505 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 15:55:27 ]
- そのまま風邪引いて肺炎悪化させて死んでくれ
- 506 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 16:56:15 ]
- こんにちわ。誘導されてきました。
セマフォの扱い方について、よろしければ教えてください。 以下が環境です。 ・HP-UX & aCC ・共有メモリを使用し、その排他制御にセマフォを使用している ・共有メモリとセマフォは専用のクラスを作成して管理している ・上記資源は複数のプロセスで使用する ・上記管理クラスのインスタンスはプロセス内に複数存在する やりたいことは以下の通りです。 ・1つのプロセス内で、同じキー値を利用するセマフォの lock を ネストさせても2回目以降の lock で固まらないようにしたい ・unlock はネスト中の実際に lock した箇所に対応したところで 実行するようにしたい void a() { void b() { CSemafore sem1; CSemafore sem2; sem1.lock(); sem2.lock(); ←ここで固まらないようにしたい b(); sem2.unlock(); sem1.unlock(); ←ここで解除したい } } セマフォのクラスインスタンスが1つの場合は lock の回数を数えるカウンタを 用意することで解決できそうなのですが、複数の(同じキー値を利用する)インスタンスが 絡んできた場合に、上手に処理する方法が思い浮かびません。 こういったことは可能なのでしょうか。ご教示頂けると嬉しく思います。 よろしくお願いいたします。
- 507 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:01:47 ]
- trylockしてみて無理だったら待てばいいんじゃねぇの?
違うってかゴメンね
- 508 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:27:39 ]
- >>506
どういうデッドロックを想定しているの? th1がaをlockしてbを得ようとして、th2がbをlockしてbを得ようとしているとか? 入れ子セマフォア 多重セマファオ で解決できませんか?
- 509 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:47:33 ]
- >>508
>入れ子セマフォア >多重セマファオ おチツ毛
- 510 名前:506 mailto:sage [2006/06/10(土) 19:05:08 ]
- >>507
ご返信ありがとうございます。 trylock とは「lock が可能な状態であれば lock を実行し、そうでなければなにもしないで 終了する」処理との理解で正しいでしょうか。trylock が失敗した場合の処理を実装できれば よいのですが、出来るだけ単純化したいと考えており、今回の件では少し辛いです。すみません。 >>508 ご返信ありがとうございます。 知識が足りず「入れ子セマフォ」「多重セマフォ」の言葉が分かりません。 検索も試したのですが... すみません。 今回はスレッドを使用していないので基本的にはプロセス単位で考えています。 目的としては同一プロセス(スレッド)による lock でデッドロックを発生させないように する方法を探しています。ご例示頂いた異なるスレッドによるデッドロックは‥‥実際にやって いたのですがw、プログラムを直してうまく動くようになりました。 先の投稿に記述した「やりたいこと」について考えていたのですが、以下のようにすれば 出来そうに思えてきました。 ・2つめの unlock 位置の判定の件は「カウンタ」の管理で解決できそう (もっと良い方法があるようでしたらご教示頂けると嬉しいです) ・1つめのネスト時のデッドロック防止については、セマフォのキー値毎に最後に lock を 掛けたプロセス(スレッド)を識別出来るようにして、それが自プロセス(スレッド)で ない場合だけ lock 処理を実施する 上記の「最後に lock を掛けた(sembuf.sem_op を 0 にした)プロセス(スレッド)を識別する」 方法はあるのでしょうか。お知恵を拝借できれば幸いです。 >>509 少しウケました。そのノリは高校の時以来です。w
- 511 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 19:54:30 ]
- >>510
ttp://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%9E%E3%83%95%E3%82%A9 古典的って言ったら古典的か.
- 512 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 19:56:50 ]
- >>510
ロックの話だけで頭がいっぱいになってるけど そのsem1とsem2の間でどんな処理をするのか 教えてよ。
- 513 名前:506 mailto:sage [2006/06/10(土) 21:59:59 ]
- >>511
ご返信をありがとうございます。 これは「多重セマフォ」の解説(使用例の項)でしょうか? 残念ですが、今回の件は同時参照を全て止める必要があるため、初期値を大きくすることに よって解決とすることは出来ないと思います。情報をありがとうございました。 >>512 ご返信をありがとうございます。 不要と判断していました。たとえばですが。 共有メモリにある情報をまとめたテーブルがあるとします。 関数 SetData01() はこのテーブルの特定のデータを変更します。 同様に SetData02() など複数の関数があり、それぞれ関数内部でデータを変更するための (受取手にとってわかりやすい形から格納に適した形への変換などの)処理を実施しています。 これら関数には対応する GetData**() も存在し、変更/参照時には共に排他制御(sem2)を実施します。 更に上記個別の値をまとめて取り扱う関数として SetGroupData() なる関数があり、 先の個別にデータを変更/参照する関数を内部で使用します。 この関数でのデータの変更時には、関連する全てのデータ更新が終了するまではデータ間での 矛盾発生を防ぐために他からのデータ参照を止めたい場合があるため、この関数の実行時にも 排他(sem1)を掛けたいと考えています。 回避策として、SetGroupData() で SetData01() などを呼ばずに自前で個別データの 設定を行う方法もあるのですが、少々煩雑な処理をするところもあるため、可能であれば SetData01() などを利用する形に出来ればと思っています。 そのままのことは書けないため、説明が足りないところもあるかと思いますがご容赦ください。
- 514 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 23:56:28 ]
- >>513
そのよくわからんけど、SetDataなんちゃらっていうメソッドをいくつも用意するの? そんなことするよりもさ SetData(class data)を用意してこいつが責任もって共有データを単独で更新すればいいんじゃないのか? じゃあ、みんなで同時に呼べねーべバーカとか思うなら、このSetDataは要求をスタックに貯めて逐次実行する 仕組みだけを排他制御で実装すればいいよね。共有メモリに置く程度のデータならそれぐらいで間に合わないかな?
- 515 名前:506 mailto:sage [2006/06/11(日) 15:27:03 ]
- >>514
ご返信、ありがとうございます。 初めからそういう方向性を考えていれば...と後悔しているところです。(汗 次こそわ。
- 516 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 20:23:12 ]
- いや、変えないと今のも終わらないから。
- 517 名前:デフォルトの名無しさん [2006/06/12(月) 17:52:57 ]
-
質問です。 _beginThreadを使ってスレッドをつく、その中でゲームの描画をまわしているのですが void ThreadMain(void* pParam) { HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); DWORD dwLastTime = timeGetTime(); while(!pApp->m_bStopThread) { WaitForSingleObject(hEvent, 16 - __min(16, timeGetTime() - dwLastTime)); dwLastTime = timeGetTime(); //実際はここで描画をするけど、今は空. } CloseHandle(hEvent); _endthread(); } こんなことを行なうとタスクマネージャー上でCPUパワー使用率が100%近くになってしまいます。 (WaitForSingleObjectは、待機中CPUパワーを使わないとあったので期待したのですが) Sleepあたりを入れてみたりしても、Sleep(1000);くらい大きく指定しないと使用率0%付近になりません。 スレッドを使った場合、CPU使用率は高くなってしまうものなのでしょうか? 今まではスレッドを使わず、WinMainで処理をしていたのですが、そちらでは使用率が0%に近かったです。
- 518 名前:デフォルトの名無しさん [2006/06/12(月) 17:53:43 ]
-
今までスレッドをやらないパターンですとこんな感じでした。 CPU使用率は常に0%付近でした。 //WinMainに while(TRUE){ while(0 != PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){ if (!GetMessage(&msg, NULL, 0, 0)) return msg.wParam; TranslateMessage(&msg); DispatchMessage(&msg); } else if (16 <= timeGetTime() - dwLastTime){ dwLastTime = timeGetTime(); // 処理 } }
- 519 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 18:04:20 ]
- >>517
それ、WaitForSingleObject で待ってない(即リターンしてる)から。 他のスレッドが所有権を持ってないので、呼び出したスレッドが即座に所有権を得ておしまい。 2度目以降の呼び出しは、呼び出したスレッドがすでに所有権を持っているので即座に完了。 他のスレッドに所有権を持たせておくか、selectとかSleepでも使うべし。
- 520 名前:519 mailto:sage [2006/06/12(月) 19:39:57 ]
- 今思いついたんだけど、とにかくタイムアウトさせたいなら
GetCurrentThread() で得たハンドルを wait してもいいのかもしれない。
- 521 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:45:59 ]
- >>519
アドバイスありがとうございます。 ただ、デバッガで追ってみましたところきちんと毎回Waitしている様子です。 Wait時間を分かりやすく5秒にしてみたところ、私の期待通りの動作をしているようです。 selectについてもこれから試してみたいと思います。
- 522 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:53:00 ]
- Sleep、WaitForSingleObject、いずれも、寝ている時間の精度自体は5msも保証できない
- 523 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 19:57:04 ]
- >>522
なんと、そうなのですか? やはりFPS60なんていう精度を望む場合 Waitなんて無しでぶんまわしつづけるしかないのでしょうか? (そもそも、Windowsで精密ゲームを作ること自体、Windowsの設計理念とは反している気がしますが)
- 524 名前:519 mailto:sage [2006/06/12(月) 20:25:43 ]
- >>521
そですか・・・ところでメインスレッド側は PeekMessage 無しに戻しましたか? 単純に >>518 から else 以降を取ってしまうと、CPU 100% のビジーループに なるわけですが。
- 525 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 21:08:55 ]
- ところで、なんで、NOREMOVEでPEEKしたあと、またGetMessage呼んでるの?
単純に、直接REMOVEでPEEKして、Translate,Dispatchすればいいと思うんだけど
- 526 名前:デフォルトの名無しさん [2006/06/13(火) 14:46:50 ]
- pthread_create() で作ったスレッドが終了したかどうかの確認は
どうしたらいいんでしょうか? pthread_join() してしまうとその スレッドが終わるまで待たされてしまいますよね? やりたいことは、複数のスレッドを作って、作った側で pthread_t の配列にスレッド識別子を入れておき、それぞれがバラバラの 時間で終わるんですが、作った側で pthread_t の配列に入っている 値を元にそれぞれが終わったかどうかを確認して、終わっていたら それに対して pthread_join() をやって資源開放をて、配列の側も その部分を終了しているという値(たとえば0)にしたいんです。 (つまり UNIX で複数 fork() したあとで waitpid() の WNOHANG みたいにして何が終わったか、あるいは何も終わっていないのかを 確認するのと同じことです)。こういうのは pthread ではどうやる んでしょうか?
- 527 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 21:33:23 ]
- pthreadは詳しくないけど自分でフラグ作っても大して開発効率落ちないと思う。
- 528 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 00:10:40 ]
- SIG_CHLDシグナルで判断しろよ
- 529 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 12:15:21 ]
- >>528
pthread で作ったスレッドに対して SIGCHLD は使えないのでは? 子プロセスじゃないんだし。(Linux の実装だと使えるとか?)
- 530 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 13:11:53 ]
- POSIX P1003.1cにpthread_kill()ってのがあって、
signalを指定する引数に0を指定すると、 pthreadがいれば成功(シグナルは何も送られない)、 いなければESRCHのエラーになる。 processに対するkill(2)と同じ仕様。 > 自分でフラグ作っても大して開発効率落ちないと思う。 ではありますが。
- 531 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 13:23:26 ]
- >>530
あー! その手があったか。 くっそー。 pthread_kill() の man ページは見ていたのに気が付かなかった。 どうもありがとうございます。
- 532 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 17:46:23 ]
- スレッドのデバッグって何使ってますか?
Linuxだとgdbだけかな?
- 533 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 00:32:10 ]
- 知恵と勇気
- 534 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 01:05:12 ]
- >>533
そんなのいらねーよ何か教えねーと食うぞ?
- 535 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 10:33:24 ]
- 「ちびくろ! おまえを たべちゃうぞ!」と、とらは いいました。
- 536 名前:デフォルトの名無しさん mailto:sage [2006/06/19(月) 21:49:53 ]
- >>532
かん
- 537 名前:デフォルトの名無しさん mailto:sage [2006/06/20(火) 13:18:17 ]
- >>532
おれ、この前 gdb でやってみて大混乱。 使い方調べてから使わないといかんね。
- 538 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 17:19:02 ]
- 無茶しやがって…
- 539 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 21:26:39 ]
- Windowsで、タスク内の複数スレッド間だけで通用する、高速な同期オブジェクトって無いですかね?
なんか、どれもこれも、重そうで。
- 540 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:41:41 ]
- イベント系はユーザーモードで実行される。
イベント系はプロセス間の動機にも使えるという強みがある。 クリティカルセクションのみカーネルモードで実行される。 クリティカルセクションはプロセス間の動機で使えないがイベント系に比べると 非常に高速だという強みがある
- 541 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:49:15 ]
- >>540
クリティカルセクションって何?
- 542 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 23:58:44 ]
- ミューテックスとほぼ同じ。
タイムアウト指定ができなかったりする。
- 543 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 00:07:28 ]
- カーネルモードに移行するものが高速で
ユーザーモードのまま実行できるものの方が遅いって?
- 544 名前:539 mailto:sage [2006/06/25(日) 03:10:41 ]
- クリティカルセクションだと、スレッド間での排他は楽だけど、同期には使えないよね。
イベント系はカーネルまで落ちるし、プロセス間で使えるから重いよね。 同期に使えて、カーネルまで落ちなくても良いようなヤツが欲しいンだけど、 Windowsでは用意されてない気がするんだ。 それって、正しいのかな?
- 545 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 03:29:24 ]
- 2つのスレッドだけでいいのならクリティカルセクションでも同期は取れる。
最初にどちらかのスレッドが所有権を保持するようにする。 片方のスレッドはEnter.....()で所有権が解放されるまで待機。 所有権を持っていたスレッドが所有権を解放すれば片方のスレッドは 実行が開始されるようになる。 高速性が大事でかつ簡易な同期処理でいいならこんな方法もある。 関数自作するとか。排他制御ができれば後は自分でいろいろできる。
- 546 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 06:33:19 ]
- Fiberでも使ってみたら?
NT以降専用だが。
- 547 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 07:21:53 ]
- 以前も微妙に話題になったが、MeteredSectionとか、
AdvancedWindowsのOptExとかで楽しちゃうってのもある。 MeteredSection ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndllpro/html/msdn_metrsect.asp OptEx tp://www.microsoft.com/msj/archive/S1DA0.aspx
- 548 名前:539 mailto:sage [2006/06/26(月) 17:26:10 ]
- >>545
>>546 >>547 とりあえず、情報どうも。Fiberだと排他・同期というより切替に近いので、同期にはならない気がする。 問題は、CriticalSection系は、同一スレッド上では同期しないので、>>545さんの方法、OptExはちょっと難しい感じ。 つーか、それだとどちらか片方の処理が重いときにバグになっちまう。 ということで、MeterdSectionを使うのが良いのかなぁ。でも、こいつ、CriticalSectionの拡張版みたいなもんみたいだから、 排他は出来るけど、同期は難しそう。 探したら日本語のページがあったので貼り付け。 ttp://www.microsoft.com/JAPAN/developer/library/jptech/msdnnews/metrsect.htm それとも、原始的にロックファイル作るか…うーん、100近いスレッドが立ったとき考えるとやりたくないな…。 とりあえず、Mutexあたりを、最初にまとめて作成することで負担を減らすしかなさそうな感じ。 みなさん、ありがとう。 では。
- 549 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 21:28:46 ]
- >>548
具体的にどんな処理がしたいの? 単一プロセス内ならCriticalSection で何でも作れるよ (だからこそOSもCriticalSectionしか提供してないわけで)。 あと「同一スレッド上では同期しないので」ってのはどういうことを 意図してるのかちょっとわからない・・・同一スレッドで非同期に コードが実行されるのは Unix の signal のケースくらいで、 Windows のユーザモードでは起きないんじゃない?
- 550 名前:デフォルトの名無しさん mailto:539 [2006/06/27(火) 22:11:04 ]
- >>549
ありゃ、そういう答えが返ってくると言うことは、 もしかして オレのCriticalSectionについて根本的な使い方や理解が間違ってるのかな…。 スレッドひとつしか無ければ、EnterCritical...をいくつ並べても無視されると思ってたんだけど、違うのかな…。
- 551 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 22:13:57 ]
- スレッドひとつならマルチスレッドじゃないからな
- 552 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 22:21:17 ]
- そんなにパフォーマンス気にしてるのに
何でロックファイルとかにいくんだ…
- 553 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 22:39:45 ]
- 英語でプログラミング勉強スレ
academy4.2ch.net/test/read.cgi/english/1151414777/l50
- 554 名前:539 mailto:sage [2006/06/27(火) 22:53:13 ]
- >>551
でも、プログラムは大抵、ひとつのスレッドから開始されるんだよ。最初からふたつってわけじゃない。 まあ、だから、>>545 は使えないんだよな。
- 555 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 23:12:31 ]
- なにか、壮大な勘違いをしている予感
- 556 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 01:48:11 ]
- まず、「同期する」をどういう意味で使っているのか説明してもらってからだな
- 557 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 01:56:37 ]
- 同期の人と一緒に仕事をする
同期するじゃね?
- 558 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 03:31:41 ]
- >>539
そういうのは、ふつーにeventだの何だのをでも使ってみて、重くてやってらんなくなってから考えれば良い。
- 559 名前:539 mailto:sage [2006/06/28(水) 14:26:16 ]
- >>558
なんだそりゃ。そう言う回答は勘弁して欲しいぞ。
- 560 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:09:22 ]
- なんで>>539は質問してる身分でやたらと偉そうなの?
リアルでもそういう質問の仕方しか出来ない人?
- 561 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:16:15 ]
- >>559
「回答」ではないだろう。 「重そう」と思うだけで実際にやってみることもせず そのくせ「ロックファイル」なんて単語まで飛び出し 結局何がしたいのか、「同期」が何を指しているのかも 説明してくれない君への アドバイスじゃまいか。
- 562 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:45:09 ]
- おまえら馬鹿なんじゃね?
- 563 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 16:54:40 ]
- >>560-561
ウザ
- 564 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:45:49 ]
- つーか、時々デッドロックするようなプログラムしか作ってないのかょ、おまえらは。
- 565 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:46:52 ]
- なにか、壮大な勘違いをしている予感
- 566 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:17:22 ]
- なにかが気に喰わなくて暴れ始めたお母ん
- 567 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:54:40 ]
- 予感でプログラムが組めるヤツはニュータイプ。
- 568 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 21:21:38 ]
- まてまて。
>>539 はWindows のカーネルやAPIを設計した人たちや 普段からマルチスレッドAPなんかさんざ書いてる漏れも 見落としている、何か難しい問題に対処しようとしてるんだよ。 それはたぶんロックファイルと関係のあるなにかなんだろう。 漏れには想像もできないが、頭ごなしに否定しないでだまって 観察してあげるべきじゃないか?
- 569 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 22:34:06 ]
- なにか、壮大な勘違いをしている予感
- 570 名前:asdlman mailto:sage [2006/06/28(水) 22:40:26 ]
- >>569
>>555 lead reth !!!
- 571 名前:asdlman mailto:sage [2006/06/28(水) 22:47:52 ]
- >>569
>>555 test
- 572 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 23:21:13 ]
- Vistaから同期IOのAPIがキャンセル可能になるそうですね!
- 573 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 13:12:51 ]
- それは、非同期IOのことだろ。
- 574 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:47:52 ]
- >>573
同期IOだよ。非同期IOのキャンセルならWindows98でも出来る。
- 575 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:54:38 ]
- それを非同期というのではないのか?
- 576 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:11:59 ]
- >>575
めんどくさいなーもう。ほらよ↓ 今まではCerateFile なんか非同期版がなかったからキャンセルできなかっただろ? www.microsoft.com/japan/msdn/windowsvista/general/win32iocancellationapisv2.aspx
- 577 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:29:46 ]
- >>575
いや、絡んでるつもりは全くなかったんだ、すまん。 つまり、同期I/Oを他のスレッドで実行することによって擬似非同期I/Oの ような使い方をしたときに、そのAPIの実行をキャンセルすることができる ようになったということだな。 同期/非同期とはそういうことだったのか。勉強になった。
- 578 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:30:17 ]
- s/>>575/>>576/
- 579 名前:デフォルトの名無しさん [2006/07/01(土) 17:16:56 ]
- Linuxのカーネル層でマルチスレッドのような
設計が必要になっているんですが、 Aという関数が終わったらBの関数で 止めていたところが動き出すような設計って どうやったら良いもんですか? セマフォを使った排他処理ってデータに 対する排他処理になると思うんだけど、 そういう形で発想の転換をしないと駄目なのかな?
- 580 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 19:10:53 ]
- 待ちたいところでスピンロックでもasm WAITでもなんでもしておけばいいだろう
- 581 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 21:33:47 ]
- >>579
condは適当に初期化。 A() { 〜; pthread_cond_signal(&cond); return; } B () { pthread_cond_wait(&cond); 〜; return; }
- 582 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:07:31 ]
- >>581
参考になります。 これってAのreturnの直前でBが動き出す ということですよね? Aが終わってからってのはやっぱり難しいのかな。
- 583 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:20:08 ]
- >>582
AA() { A(); pthread_cond_signal(&cond); return; }
- 584 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:23:13 ]
- >>522
昔の奴へのレスで恐縮なんだがWindowsのSleepってそんな精度悪かったっけ? ::timeBeginPeriodとか使っても駄目?
- 585 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 22:49:29 ]
- 他に忙しく仕事をする連中が居なければ、だいたいは大丈夫かもね。
- 586 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 23:26:40 ]
- >>585
なるほど まあそれほど信用できないってことか。
- 587 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:04:19 ]
- スレッドの教科書ってどんなのあるの?
アルゴリズム系に強いやつが欲しい
- 588 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:14:48 ]
- OSによって違うな。
pthreadなら>>1->>9辺り見て。
- 589 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:18:29 ]
- Lamport's bakery algorithmとかさこんな古典的なやつから
今の新しいアルゴリズムまで載ってるのないのか.....
- 590 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:49:51 ]
- >>583
AAは別の人のソースなので手を加えられないのです。 でも参考になりますた。 ありがとうございますた。
- 591 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 06:53:31 ]
- windows には win32 API で色々なイベントを使えるようになってますが、
UNIXではpthreadのイベントを使う以外にないのでしょうか?
- 592 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 07:26:25 ]
- >>591
例えばこういう奴? www.monkey.org/~provos/libevent/ どの UNIX を対象にしているかで答えも変わるけど、大抵はググれば色々出て来る。
- 593 名前:デフォルトの名無しさん [2006/07/05(水) 10:16:26 ]
- Winsock、_beginthreadで起動して、
グローバル変数で終了要求するような、 簡単なスレッド書いているのですが、、、。 スレッド内でrecv()のような、 ブロックするような関数を呼びたくなりました。 これを終了するにはどうしたらよいでしょう。
- 594 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 10:30:57 ]
- ソケットオプションでノンブロッキングにすればいいんでない?
- 595 名前:デフォルトの名無しさん [2006/07/05(水) 11:33:24 ]
- 594>
ありがとう、そうします。 一般的にはどうでしょ? ブロッキングするような関数をスレッドで呼んではいけない?
- 596 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 11:51:06 ]
- ブロッキングするべき状況と、そうでない状況がある。
前者ならブロックさせとけばいいし、そうでなければ非同期APIを使うか、 別個にスレッドを作ればいい。
|

|