我的应用程序运行在pSOS操作系统上。代码是用Diab C编译器编译的。
应用程序定义了许多已声明为
unsigned int call_count;
由于有可能在很短的时间内出现一些溢出,我决定将计数器声明为
unsigned long long int call_count;
我相信这至少在我有生之年不会泛滥。
我的问题是这种转变是无害的吗?有没有我需要关心的开销。当应用程序处于压力下时,调用计数将不断增加。表演能成功吗?SNMP管理器也将每隔15秒查询这些计数器。
最佳答案
您的代码是否假定递增32位变量是一个原子操作?在32位CPU上递增64位变量可能不是原子的,除非您特意这样做。
例子:
当来电时,call_count
等于0x00000005FFFFFFFF
。call_count
的下半部分递增:call_count
设置为0x000000500000000
并且CPU的进位设置为1。call_count
的上半部分按进位递增:call_count
设置为0x0000000600000000
。
如果另一个线程或中断处理程序在步骤2和步骤3之间读取call_count
的值,它将得到错误的结果(0x000000500000000
而不是0x000000600000000
)。解决方案是同步访问call_count
。一些可能性:
禁用中断(如果适用)
使用锁序列化访问
使用原子/联锁函数读写(例如:Windows上的InterlockedIncrement()
)
关于c - 将32位变量的类型更改为64位变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/470167/