私はマルチスレッド システムを使用しており、x個のスレッドが同時にネットワークにパケットを送信しています。
これはすべてうまくいきますが、特定のレートでパケットを送信するために速度を制限したいスレッドもあります。
そのため、パケット インジェクション ループにスリープを入れると、小さな速度 (1 Mbps から約 70 Mbps まで) でスレッドが適切に遅くなりますが、1 Gbps に制限したい場合は、スリープではその速度に到達できません。所定の位置に。すべてのスレッドからスリープを削除すると、それぞれ約 2 Gbps で注入できるため、その速度に到達できることがわかりました。
テストとして、私は自分の睡眠を
usleep(0);
これにより、速度が再び最大速度に戻るはずだと信じていましたが、まだ制限されたままです (最大速度の約 1/20 にしか達しません)。したがって、私の現在の唯一の説明は、sleep(0) の場合でもスレッドが譲歩するため、どのスレッドも十分な実行時間を取得していないということです。
長い説明で申し訳ありませんが、そのようなパフォーマンスの低下を引き起こさずにスレッドをスリープ状態にするより良い方法はありますか?
usleep と nanosleep を試しましたが、両方で同じ結果が得られました。すべてのテストで同じ設定、つまりスレッド数
システム: CentOS、pthreads、g++ 4.4.6