原子操作与并发保险
原子操作与并发安全一直以来,都对原子操作和并发安全都有些误解,认为一个操作不是原子的,那它就不是并发安
原子操作与并发安全
一直以来,都对原子操作和并发安全都有些误解,认为一个操作不是原子的,那它就不是并发安全的,这样以来,就迟疑了,这么说来:
C语言一个简单的赋值语句也不是原子的咯? a = b是否是原子操作? 见代码如下:
movl8(%ebp), %eaxmovl12(%ebp), %edxmovl%edx, (%eax)
解释如下:
8(%ebp) ==> _v 12(%ebp) ==> v movl 8(%ebp), %eax ==> %eax赋值为_v的地址 movl 12(%ebp), %edx ==> %edx赋值为v的地址 movl %edx, (%eax) ==> %eax对应地址的值赋值为%edx对应的值
过程其实都一样,无非为了说明,赋值操作不是原子的。如果是我以前的理解,不是原子操作就不是并发安全的,那并发程序该怎么写阿?
其实只能说,这是我的误解,首先我们要仔细想想,在什么情况下才会产生并发问题:
就我的理解,多个线程竞争共享数据时,才会有并发问题,回过头再来看上面那几行汇编代码,_v属于共享数据,可真正产生竞争只可能在movl %edx, (%eax),这个时候,可能有多个线程想进行这一步操作,事实上这个操作应该算是原子的吧,因此这样的赋值操作就应该是并发安全的。 1 楼 jilen 2011-10-13 a,b是局部变量而已,这里有并发问题么?
还是我又二了? 2 楼 fp1203 2011-10-14 jilen 写道a,b是局部变量而已,这里有并发问题么?
还是我又二了?
前面main函数中的a,b只是为了解释原子性而已,讨论并发问题主要是针对后面的CObject的方法,你没有理解错