私はネットワーク制御機能を書いているので、アルゴリズムは
- 現在の転送速度を読み取る
必要な転送レートよりも低い場合は続行し、そうでない場合は数 x 秒間スリープしてからステップ 1 に進みます。
x は、必要な転送速度と現在の転送速度に基づいて計算されます。
このアルゴリズムをスレッドセーフにする方法を教えてください
スレッドセーフの意味によって異なります。「スレッドセーフ」とは、「クラッシュ、デッドロック、またはライブロックしない」という意味の場合、次のようにするだけで十分です。
x = atomic_read(current_transfer_rate);
memory_barrier();
if (x >= required_xfer_rate)
sleep(f(x));
current_transfer_rate
ローカル変数にキャプチャしてからメモリバリアを発行することが重要であることに注意してください(これを行う方法はコンパイラによって異なります)。これにより、コンパイラが変数を2回以上読み取らないようになり、一貫性のない結果が生じる可能性があります。
もちろん、他のプロセス/スレッドがさらにデータを送信し、送信する前にcurrent_transfer_rateを増やして、current_transfer_rateが制限を超える可能性があります。これを回避する唯一の方法は、送信用の中央ロックまたはキュー、または転送容量をアトミックに「予約」する方法です。