ブロッキングを独自にやりたい

[戻る]
ars 2005/07/13(水) 21:15:46
Winsockのrecvのように処理が完了するまで、関数をロックして
完了したた元のプロセスへ結果を返すというようなことをしたいのですが
例えば
while(true){
if(flg)break;
Sleep(100);
}
というような方法を思いつくのですが、これだと応答までに最大100ミリ秒の遅延
が発生してしまう。
ロックしてる間CPUのリソースを消費してしまう。
という欠点が出てきてしまうのですが、何か良い方法があるのでしょうか?

ars 2005/07/13(水) 21:28:05
環境書き忘れました。
一応Windowsなんですが、出来ればOS依存しない方法がいいです。
言語はVC++6.0です。MFCではありません。

tib 2005/07/13(水) 21:43:09
Windowsの場合、WaitForSingleObject()などの「WaitFor系関数」を使うのが私の常套手
段ですが、OS非依存が大前提なら私もsleep()を多用しています。

超初心者 2005/07/14(木) 02:12:59
それとスリープ中は別スレッドの実行に移るのでCPUを無駄に使ってしまうことにはなり
ません。
でも遅延にはなりますけどね。

この場合は同期オブジェクトのイベントがいいんじゃないのかな。
flgをイベントに変えて、while-if-SleepをやめてWaitForSingleObjectにする。

ryo 2005/07/19(火) 08:42:49
かなり今更ですが
sleep(0)はどうでしょう?

脱線ご免 2005/07/19(火) 10:59:03
Sleep(0) を Sleep(1) にすると劇的に軽くなったりしますが、ゼロ指定って利いてるの
でしょうか。MSDNのSleepには書いてないようで、公式な資料はしらないのですが、実は
単に他の待ちスレッドがない限り動き続けるポーリングだったりして。
便乗ですみませんが何かご存知の方がいれば教えてください。

もね 2005/07/19(火) 11:53:29
>MSDNのSleepには書いてないようで

書いてありますよ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dllproc/base/sleep.asp

>A value of zero causes the thread to relinquish the remainder of its time 
slice to any other thread of equal priority that is ready to run. If there are 
no other threads of equal priority ready to run, the function returns 
immediately, and the thread continues execution.

脱線ご免 2005/07/19(火) 12:43:50
> 書いてありますよ。

動きは予想通りですが記述があったのですかっ(驚!
手元の版が古いのか単なる見落としか…逝ってきます。
もねさんどうもありがとうございました。

ars 2005/07/19(火) 18:24:43
Sleep(0)は知りませんでした。
一応やってみたんですが、スレッドがないのかCPU100%になりますね。
常に動いてるものなもで100%になるのはちょっと厳しいですね。
Mutex系のロック機構みたいな感じにしたいのですが、どうやってるんでしょうね。
調べてはいるんですが、いまいちよくわかりません。

ars 2005/07/19(火) 20:05:49
[[解決]]
いろいろ調べましたが
WaitForSingleObjectしかないみたいですね

1.スレッドAで関数実行
2.スレッドBでロック
3.スレッドAでロック
4.スレッドBで処理して結果がでたら解除
5.スレッドAで解除&関数を返す

という感じしかないですよね。
なんか頭が混乱してます。

古いスレッドには追加発言できません。