Winsockのrecvのように処理が完了するまで、関数をロックして
完了したた元のプロセスへ結果を返すというようなことをしたいのですが
例えば
while(true){
if(flg)break;
Sleep(100);
}
というような方法を思いつくのですが、これだと応答までに最大100ミリ秒の遅延
が発生してしまう。
ロックしてる間CPUのリソースを消費してしまう。
という欠点が出てきてしまうのですが、何か良い方法があるのでしょうか?
環境書き忘れました。
一応Windowsなんですが、出来ればOS依存しない方法がいいです。
言語はVC++6.0です。MFCではありません。
Windowsの場合、WaitForSingleObject()などの「WaitFor系関数」を使うのが私の常套手
段ですが、OS非依存が大前提なら私もsleep()を多用しています。
それとスリープ中は別スレッドの実行に移るのでCPUを無駄に使ってしまうことにはなり
ません。
でも遅延にはなりますけどね。
この場合は同期オブジェクトのイベントがいいんじゃないのかな。
flgをイベントに変えて、while-if-SleepをやめてWaitForSingleObjectにする。
かなり今更ですが
sleep(0)はどうでしょう?
Sleep(0) を Sleep(1) にすると劇的に軽くなったりしますが、ゼロ指定って利いてるの
でしょうか。MSDNのSleepには書いてないようで、公式な資料はしらないのですが、実は
単に他の待ちスレッドがない限り動き続けるポーリングだったりして。
便乗ですみませんが何かご存知の方がいれば教えてください。
>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.
> 書いてありますよ。
動きは予想通りですが記述があったのですかっ(驚!
手元の版が古いのか単なる見落としか…逝ってきます。
もねさんどうもありがとうございました。
Sleep(0)は知りませんでした。
一応やってみたんですが、スレッドがないのかCPU100%になりますね。
常に動いてるものなもで100%になるのはちょっと厳しいですね。
Mutex系のロック機構みたいな感じにしたいのですが、どうやってるんでしょうね。
調べてはいるんですが、いまいちよくわかりません。
いろいろ調べましたが
WaitForSingleObjectしかないみたいですね
1.スレッドAで関数実行
2.スレッドBでロック
3.スレッドAでロック
4.スレッドBで処理して結果がでたら解除
5.スレッドAで解除&関数を返す
という感じしかないですよね。
なんか頭が混乱してます。