如何判断++int是否为原子操作?
如何判断++int是否为原子操作?
测试代码如下:
#include<stdio.h>
#include<pthread.h>
#defineTIMES999999U
#defineTHR_MAX6
unsignedintcounts=0;
void*thrdFunc(void*)
{
for(inti=0;i<TIMES;++i)
{
++counts;
}
returnNULL;
}
intmain()
{
pthread_tpid[THR_MAX];
for(inti=0;i<THR_MAX;++i)
{
pthread_create(&pid[i],NULL,thrdFunc,NULL);
}
for(inti=0;i<THR_MAX;++i)
{
pthread_join(pid[i],NULL);
}
if(counts!=TIMES*THR_MAX)
{
printf("FAIL:%d ",counts);
}
else
{
printf("OK:%d ",counts);
}
return0;
}
#include<pthread.h>
#defineTIMES999999U
#defineTHR_MAX6
unsignedintcounts=0;
void*thrdFunc(void*)
{
for(inti=0;i<TIMES;++i)
{
++counts;
}
returnNULL;
}
intmain()
{
pthread_tpid[THR_MAX];
for(inti=0;i<THR_MAX;++i)
{
pthread_create(&pid[i],NULL,thrdFunc,NULL);
}
for(inti=0;i<THR_MAX;++i)
{
pthread_join(pid[i],NULL);
}
if(counts!=TIMES*THR_MAX)
{
printf("FAIL:%d ",counts);
}
else
{
printf("OK:%d ",counts);
}
return0;
}
以上代码分别在X86(GCC编译器)和XScale处理器上测试,多次测试的结果是:
X86上输出OK,而XScale输出FAIL。
分析如下:X86是CISC(复杂指令集)处理器,有直接操作内存的指令,示例中++counts;被编译成incl counts。XScale是RISC(精简指令集)处理器,RISC是基于Load/Store的指令集,没有直接操作内存的指令,示例中++counts;被编译为,
ldrr2, .L5
ldrr3, .L5
ldrr3, [r3, #0]
addr3, r3, #1
strr3, [r2, #0]
因此++int在像X86这样的CISC处理器中可以是原子操作,而在RISC处理器中不可能是原子操作。
同时,也和编译器有关,以上结果是在未优化的情况下。
一般来说,++int操作不可看作为原子操作。