我正在编写一个网络控制功能,因此算法是
- 读取当前传输速率
-
如果它小于所需的传输速率,则继续其他的睡眠x秒,然后进入步骤1:
-
x是基于所需传输速率和当前传输速率来计算的。
你能建议一下如何使这个算法线程安全的
这取决于线程安全的含义。如果"线程安全"的意思是"不会崩溃、死锁或活锁",那么只需简单地:
x = atomic_read(current_transfer_rate);
memory_barrier();
if (x >= required_xfer_rate)
sleep(f(x));
请注意,将current_transfer_rate
捕获到局部变量,然后发出内存屏障非常重要(具体如何执行取决于编译器)。这将确保编译器不会多次读取变量,从而可能产生不一致的结果。
当然,其他进程/线程可能会发送更多的数据,在传输之前增加current_transfer_rate,从而导致current_transfer超出限制。避免这种情况的唯一方法是为传输设置中央锁或队列,或者原子地"保留"传输容量。