如何判断++int是否为原子操作?

如何判断++int是否为原子操作?

测试代码如下:

如何判断++int是否为原子操作?#include<stdio.h>
如何判断++int是否为原子操作?#include<pthread.h>
如何判断++int是否为原子操作?
如何判断++int是否为原子操作?
#defineTIMES999999U
如何判断++int是否为原子操作?#defineTHR_MAX6
如何判断++int是否为原子操作?
如何判断++int是否为原子操作?unsigned
intcounts=0;
如何判断++int是否为原子操作?
如何判断++int是否为原子操作?
void*thrdFunc(void*)
如何判断++int是否为原子操作?如何判断++int是否为原子操作?
{
如何判断++int是否为原子操作?
for(inti=0;i<TIMES;++i)
如何判断++int是否为原子操作?如何判断++int是否为原子操作?
{
如何判断++int是否为原子操作?
++counts;
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?returnNULL;
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?
如何判断++int是否为原子操作?
intmain()
如何判断++int是否为原子操作?如何判断++int是否为原子操作?
{
如何判断++int是否为原子操作?pthread_tpid[THR_MAX];
如何判断++int是否为原子操作?
for(inti=0;i<THR_MAX;++i)
如何判断++int是否为原子操作?如何判断++int是否为原子操作?
{
如何判断++int是否为原子操作?pthread_create(
&pid[i],NULL,thrdFunc,NULL);
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?for(inti=0;i<THR_MAX;++i)
如何判断++int是否为原子操作?如何判断++int是否为原子操作?
{
如何判断++int是否为原子操作?pthread_join(pid[i],NULL);
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?
如何判断++int是否为原子操作?
if(counts!=TIMES*THR_MAX)
如何判断++int是否为原子操作?如何判断++int是否为原子操作?
{
如何判断++int是否为原子操作?printf(
"FAIL:%d ",counts);
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?else
如何判断++int是否为原子操作?如何判断++int是否为原子操作?{
如何判断++int是否为原子操作?printf(
"OK:%d ",counts);
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?
如何判断++int是否为原子操作?
return0;
如何判断++int是否为原子操作?}

如何判断++int是否为原子操作?

以上代码分别在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操作不可看作为原子操作。