用于以下算法的锁定自由算法版本

时间:2011-06-28 21:50:28

标签: c++ lock-free

我正在编写网络控制功能,因此算法

  1. 读取当前转移率
  2. 如果小于所需的转移率,则继续 其他 睡几秒钟,然后转到第1步:

  3. x是根据所需的转移率和当前转移率计算的。

  4. 你能否建议如何使这个算法线程安全

1 个答案:

答案 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超出限制。避免这种情况的唯一方法是用于传输的中央锁或队列,或者以原子方式“保留”传输容量的方法。