循环中的循环算法

Round robin algorithm in a loop

round-robin算法如何实现永远循环运行?

for (int i = 0; ;i++){
    roundRobinIndex = i % numberOfWorkers;
}

上述方法的问题是integer overflow问题。也可以通过检查 i:

的值来实现
for (int i = 0; ;i++){
    roundRobinIndex = i % numberOfWorkers;
    if i == maxNumber{
        i = 0;
    }
}

但是这种方式看起来很难看。也许有更优雅的方式?

为什么不呢?

int numberOfWorkers = 10
int roundRobinIndex = numberOfWorkers - 1
while(true){
    roundRobinIndex = (roundRobinIndex + 1) % numberOfWorkers
}

或使用 for 循环

for (int i = 0; ;i = (i + 1) % numberOfWorkers){
    roundRobinIndex = i;
}

我们现在可以去掉 i

为了完整起见(我同意 pLopeGG 的回答更优雅)- 如果你将 i 设为 unsigned int 而不是 int,你的方法将非常有效,因为定义了溢出在无符号溢出的标准中,但未签名。

for (unsigned int i = 0; ;i++){
    roundRobinIndex = i % numberOfWorkers;
}

避免任何模调用,我们可以这样做:

constexpr int nextRR(int curIdx, int sz) {
    if(curIdx==sz-1) {
        return 0;
    }
    return curIdx+1;
}

for (int rrIndex = 0;;rrIndex = nextRR(rrIndex, sz)) {
    // use rrIndex here ...

}

如果在编译时不知道 worker 的数量,这将比任何基于模的解决方案在性能方面更有效。

注意 nextRR 也可以这样写,以进一步优化与 0 比较比与变量比较更快的平台:

constexpr int nextRR(int curIdx, int sz) {        
    if(curIdx==0) {
        return sz-1;
    }
    return curIdx-1;
}

为什么不将 % 放入循环中?

for (int i = 0; ;++i, i %= numberOfWorkers)
{
}