所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。
再举个形象的例子:
比如对于操作过程i++,它不是原子级的,共包含3个步骤:
(1)栈中取出i
(2)i自增1
(3)将i存到栈
现在有多线程来并发进行A操作,可能线程1正在进行步骤一即取出i,而线程三正在进行步骤三即将i存到栈中,这样子线程一和线程三就会互斥从而产生矛盾。
解决方案:
使用原子级的数据类型,代码如下:
// 用原子数据类型作为共享资源的数据类型 atomic_long total(0); //long total = 0; void click() { for(int i=0; i<1000000;++i) { // 仅仅是数据类型的不同而以,对其的访问形式与普通数据类型的资源并无区别 total ++; } }