原子操作及其重要性

来源:互联网 发布:计算机java二级考试 编辑:程序博客网 时间:2024/05/19 22:56

何为“原子操作”呢?

    其实说白了,就是一个由多步操作组成,这些步骤要不执行就一个都不执行,如果执行的话,那么从第一步开始到最后一步结束绝对不会被信号等线程调度机制打断。

   《APUE》上说的“原子的执行”也就是这个意思了。

其重要性在哪呢?

    我们知道,CPU在用极快的速度不停地切换运行程序,这样的好处是可以“同时”运行好多程序,但坏处就是可能会造成一些让我们头痛不已的问题。

    举个例子:

        我们想完成如下的操作:

        1. 打开一个文件(假设该文件已创建而且里面有我们需要的内容);

        2. 给该文件+读锁;

        3. 读取文件的内容;

        4. 解锁;

        5. 关闭文件。

    这个操作看起来挺安全的。但是如果出现这种情况呢:

        在上述的步骤1和2之间(即“打开文件”和“加读锁”之间)突然有一个进程打开了这个文件(这是CPU切换到了这个进程,而原来的进程则被暂时搁置了,也就是原来的进程被打断了),并往里面写入了一些内容后退出了。那么我们读到的内容可能就不是我们希望的。

    之所以会出现上面的问题,就是因为上面5步不是“原子操作”,如果是“原子操作”的话,那么从第1步开始到最后一步结束为止,不会出现被打断的情况了。

    由此,“原子操作”的重要性不言而喻。

关于“原子操作”的误区:

    下面这句代码是不是原子操作呢?

        temp += 1;

    是?不是?是不是?

    其实不是。

    因为这句代码在翻译成汇编的话如下:

        mov ax,[temp]  //将temp的值传到寄存器ax中(也就是将其值传到一个内存地址中)

        inc ax      //对寄存器ax中的值+1

        mov [temp],ax  //将寄存器ax中的值传回temp

    可见,只有一行的代码不见得就是“原子操作”。

原创粉丝点击