-2

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

  1. 读取当前传输速率
  2. 如果它小于所需的传输速率,则继续,否则休眠一些 x 秒并转到步骤 1:

  3. x 是根据所需传输率和当前传输率计算得出的。

你能建议如何使这个算法线程安全吗

4

1 回答 1

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

于 2011-06-28T21:53:36.083 回答