以下算法的免锁定算法版本



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

  1. 读取当前传输速率
  2. 如果它小于所需的传输速率,则继续其他的睡眠x秒,然后进入步骤1:

  3. 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超出限制。避免这种情况的唯一方法是为传输设置中央锁或队列,或者原子地"保留"传输容量。

相关内容

  • 没有找到相关文章

最新更新