
Ubuntu日本語フォーラム

ログインしていません。
Ubuntu10.04 G++
質問の題名が思いつかず、分かりにくくてすいません。
ポートの監視などで、whileループを使う場合、CPUが占有されてしまい、他の処理が出来なくなる場合、WindowsのVC++では
TranslateMessage(&msg);
DispatchMessage(&msg);
などを挿入して、一旦システムに処理返すようなことが行われると思いますが、
メッセージループはWindows固有の考え方だろうと思います。
Linuxの場合、どのように対処すれば良いでしょうか?
オフライン
CPU占有を避ける方法はいくつかあるかも知れませんが、スリープ関数などを入れてプログラムを一瞬停止させる方法が、OSに限らず簡単だと思います。
例えば、以下は無限ループですが、CPUの使用率はほとんど上がりません。
while(1)
{
usleep(1); // 1マイクロ秒スリープ
}オフライン
「ポートの監視」がネットワーク・ポートのことを指しているのであれば、select関数を使ってブロッキングしておくとbusyループを避けることができます。
オフライン
Windowsで行儀のいいライブラリは待ち合わせ中に適切な頻度でメッセージをディスパッチすべきという作法の話かと思います。これはメッセージを処理するスレッドが待ち合わせのために長時間CPUを占有するとウィンドウの再描画などまで滞ってしまう、などの危惧をしてのことかと思います。そしてそのような処理(作法)はWindows固有のものです。
Windowsでも正確にはメッセージのディスパッチが必要なのはGDIのライブラリを使用する場合だけのはずですが、それがあまりに一般的に使用されるものなので、行儀のいいプログラム/ライブラリでは適切な頻度でディスパッチ処理を暗黙のうちにやっておくべきと認識されています。しかしLinuxでは特別共通に使用されるライブラリはないので、暗黙のうちに必要となる処理はないと思います。強いて似たような処理をあげればシグナル回りくらいですが、waitの際に注意するような話ではありません。
あまり詳しくないので間違っていたらすみません。
オフライン