我的程序有多个处理消息的线程。为了让线程均匀地接收消息,我使用一个近全局计数器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
的力量,那么这将不适用(可能会有一些线程)。
是否有更有效和通用的方法来获得随机数的余数?非常感谢提前!
答案 0 :(得分:0)
正如OP所指出的,如果已知thread_num
在运行时期间选择值,则可以简化index = (++count) % thread_num;
。
除了“2的力量”之外,其他简化技巧也适用于其他数字。但不是一般的。
如果编译器可以确定选择值(简单情况:thread_num
是常量),现代编译器将使用各种优化,而不是由编码器快速确定。
一般答案:让编译器优化并使用%
。
index = (++count) % thread_num;
可能更有效的通用备用。
如果%
费用昂贵,请考虑将count
和index
保留在结构中(以某种方式配对)并将它们一起更新。
p.count++;
p.index++;
if (p.index >= thread_num) p.index = 0;