InterlockedIncrement的理解,高手请进。
没有学过硬件,对这个函数非常不理解。这个函数是原子锁,就是加法的操作在一条指令里面实现,而且对总线加锁。主要是对总线加锁不理解。
编译出来的汇编语句是 lock add [mem],123。保证的是代码的原子性。那么加锁保证的是什么呢?如果是单cpu,这条语句不加锁也可以起到线程同步的作用,因为只有一条语句,加锁就没有必要了。不过对于c语言,无法保证编译的时候不借助寄存器变成mov eax,[mem];add eax,123;mov [mem],eax之类,我试过O1,Od的编译结果不同。因此单cpu用这条语句的原因只是为了变成单条语句(不知道理解对不对)。所以这个加锁应该是针对多cpu的。(不知道理解是否是对的)。先不考虑cpu的缓存,加锁就没有问题,执行这条语句的cpu占有总线控制权,其他的cpu无法访问内存,如果考虑缓存,就需要有其他缓存的更新机制。整体的理解上有没有错误?请高手讲解下。
[解决办法]
单核心单CPU也可以有多线程,所以需要保证在执行加法操作的过程中不产生线程切换,所以变成一条指令也是有意义的。
对于多CPU还要保证操作数的修改结果对所有CPU/内核立即可见,所以要锁总线。即当core1要修改[mem]时,必然分成3步,读取现有值,执行加法操作,写入新值。如果不锁总线,那可能导致core1读取[mem]值后,core2也读取了[mem]值,然后core1执行了加法,core2执行了减法(比如), 然后core1写入新值,然后core2也写入新值。 最终结果基本肯定不是程序员预期的了。
[解决办法]
这么投入,有钻研精神。此文有些讨论:http://blogs.msdn.com/b/oldnewthing/archive/2013/09/13/10448736.aspx
[解决办法]
意思对了,就是有点罗嗦。
arm 没有专门指令,办法就是关中断,锁总线,读写,解锁总线,开中断。