原子操作指的是一种不可被中断的操作,能够保证在多线程或多进程环境下数据的正确性和一致性。原子操作通常以原子方式对于某个共享资源进行读写操作,不允许其他操作在操作未完成时进行干扰,保持了操作的不可分割性,故而得名原子操作。原子操作在当前软件开发中被广泛应用,涵盖了批量操作、流程控制等诸多方面。
原子操作的主要作用有:
- 确保数据的一致性和正确性:
由于多线程或多进程共享同一个内存空间,如果并发读写共享数据时,就会产生数据不一致和错误的风险。使用原子操作可以确保并发读写操作时,不会产生漏洞,保证数据的一致性和正确性。
- 提高并发性能:
在多线程或多进程的并发环境下,如果每个操作都需要锁定共享内存、进行读写操作、释放锁等步骤,会极大地降低程序的并发效率。使用原子操作可以避免锁定内存时的开销,提高程序的并发效率。
以下是两个关于原子操作的示例:
示例一:CAS
比较-交换 (CAS)是一种常见的原子操作,通常应用于并发计算中,避免并发写操作时的数据竞争。
int ret = 0;
while(!atomic_compare_exchange_weak(&value, &expected, new)) {
ret++;
}
该示例中,atomic_compare_exchange_weak
所表示的就是一次CAS操作,也可以使用atomic_compare_exchange_strong
。代码的含义是在循环中检查value的值是否与期望的expected相等,如果相等,则将新值new赋值给value,如果不相等,则继续循环。由于CAS是原子操作,因此能够保证竞争线程的操作互不干扰。
示例二:原子加操作
原子加操作是另外一种常见的原子操作,通常应用于并发计算中,用于对一个共享数据进行原子递增或原子递减操作。
atomic_int num = ATOMIC_VAR_INIT(0);
num++; // num加1
该示例中,使用了 ATOMIC_VAR_INIT
来初始化 引用类型 – atomic_int, 并使用 ++
来进行原子加操作,此操作是一个原子操作,对变量进行读取,递增,和写回这三个步骤是不可分割的,能够保证线程安全,防止数据竞争。
通过以上两个示例可以看出,使用原子操作相对于传统的锁机制提高了并发效率,避免了锁的开销;并且保证了线程的顺序执行,保证了多个线程之间的数据一致性和正确性。