是否有任何有效且通用的方法来获得随机数的余数?

时间:2014-12-29 09:05:19

标签: c algorithm

我的程序有多个处理消息的线程。为了让线程均匀地接收消息,我使用一个近全局计数器count来计算事件的数量(不严格准确),伪代码是这样的:

unsigned int index = 0;
index = (++count) % thread_num;
queue_push(queue[index], event);

我想知道是否有更有效的方法来获取索引。我知道thread_num是否是2的强大功能,以下代码非常有效:

index = (++count) & (thread_num - 1)

但如果thread_num不是2的力量,那么这将不适用(可能会有一些线程)。
是否有更有效和通用的方法来获得随机数的余数?非常感谢提前!

1 个答案:

答案 0 :(得分:0)

正如OP所指出的,如果已知thread_num在运行时期间选择值,则可以简化index = (++count) % thread_num;

除了“2的力量”之外,其他简化技巧也适用于其他数字。但不是一般的。

如果编译器可以确定选择值(简单情况:thread_num是常量),现代编译器将使用各种优化,而不是由编码器快速确定。

一般答案:让编译器优化并使用%

index = (++count) % thread_num;

可能更有效的通用备用。

如果%费用昂贵,请考虑将countindex保留在结构中(以某种方式配对)并将它们一起更新。

p.count++;
p.index++;
if (p.index >= thread_num) p.index = 0;