3

スリープする以外に C++ でプログラムを遅延させる別の方法について質問があります。

UDP パケットを受信して​​コントローラーに送信するプログラムの一部があります。プログラムのこの部分は、非同期で実行する必要があります。このプロバイダーのオーバーヘッドを削減するために、別のスレッドでソケットを監視するのではなく、非同期 IO を使用して UDP パケットを受信することにしました。

これを達成するために、この sigaction の例に従いました。この sigaction がアクティブなときに usleep を使用しようとすると、パケットを受信するたびにスリープが中断されることに気付きました。CPUのスリープを停止する可能性のあるCPU上の何らかの割り込みによってsigactionがトリガーされると想定しているため、この種のことは理にかなっています。なぜこれが起こるのかについて誰かが良い説明を持っているなら、私は知りたいです. 私の問題は、複数のパケットを連続して送信する必要があり、それらを遅延させる必要がある場合があることです。そうしないと、コントローラーがパケットを見逃してしまいます。

私は通常、スリープを使用してパケットの送信を遅らせますが、現在は、sigaction によって壊れているため、できません。ビジーウェイトを使用することも考えましたが、一貫性がなさすぎる可能性があります。タイマーを使用して定期的に空になるパケットのキューを使用することも考えていますが、もっと簡単な解決策があるようです。

スリープ以外にパケットの送信を遅らせる別の方法はありますか? スリープを中断しないように非同期 IO を設定する方法はありますか? 私はこれについて間違った方法で行っていますか?

4

2 に答える 2

2

これにより、いくつかのことが明確になるはずです。

睡眠マニュアルから:

Return Value
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler. 

1つのオプションは、時間がすでに経過したかどうかをチェックするループを作成することです(スリープは中断されたときに残りの秒数を返すため)。必要な時間の終わりまで、別のスリープなどを実行するだけではありません。

于 2014-10-02T19:48:53.007 に答える