ブロッキングを独自にやりたい – プログラミング – Home

ブロッキングを独自にやりたい
 
通知
すべてクリア

[解決済] ブロッキングを独自にやりたい


ars
 ars
(@ars)
ゲスト
結合: 19年前
投稿: 13
Topic starter  

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


引用未解決
トピックタグ
ars
 ars
(@ars)
ゲスト
結合: 19年前
投稿: 13
Topic starter  

環境書き忘れました。
一応Windowsなんですが、出来ればOS依存しない方法がいいです。
言語はVC++6.0です。MFCではありません。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

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


返信引用
超初心者
 超初心者
(@超初心者)
ゲスト
結合: 23年前
投稿: 139
 

それとスリープ中は別スレッドの実行に移るのでCPUを無駄に使ってしまうことにはなり
ません。
でも遅延にはなりますけどね。

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


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

かなり今更ですが
sleep(0)はどうでしょう?


返信引用
脱線ご免
 脱線ご免
(@脱線ご免)
ゲスト
結合: 19年前
投稿: 2
 

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


返信引用
もね
 もね
(@もね)
ゲスト
結合: 19年前
投稿: 4
 

>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.


返信引用
脱線ご免
 脱線ご免
(@脱線ご免)
ゲスト
結合: 19年前
投稿: 2
 

> 書いてありますよ。

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


返信引用
ars
 ars
(@ars)
ゲスト
結合: 19年前
投稿: 13
Topic starter  

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


返信引用
ars
 ars
(@ars)
ゲスト
結合: 19年前
投稿: 13
Topic starter  

いろいろ調べましたが
WaitForSingleObjectしかないみたいですね

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました