我正在编写网络控制功能,因此算法
如果小于所需的转移率,则继续 其他 睡几秒钟,然后转到第1步:
x是根据所需的转移率和当前转移率计算的。
你能否建议如何使这个算法线程安全
答案 0 :(得分:1)
这取决于线程安全的含义。如果'线程安全'你的意思是'不会崩溃,死锁或活锁',那么它就足够了:
x = atomic_read(current_transfer_rate);
memory_barrier();
if (x >= required_xfer_rate)
sleep(f(x));
请注意,将current_transfer_rate
捕获到本地变量然后发出内存屏障非常重要(具体如何执行此操作取决于您的编译器)。这将确保编译器不会多次读取变量,从而可能产生不一致的结果。
当然,某些其他进程/线程可能会发送更多数据,在传输之前增加current_transfer_rate,导致current_transfer_rate超出限制。避免这种情况的唯一方法是用于传输的中央锁或队列,或者以原子方式“保留”传输容量的方法。