目录
原子类型
原子类型(Atomic Types)是一种特殊的数据类型,能够保证在多线程并发访问时,操作的正确性与数据的一致性。
在多线程程序中,由于多个线程可能同时访问共享变量,可能会导致数据竞争(Data Race)问题,即多个线程同时读写同一个变量,导致程序行为不确定或出现错误。原子类型就是为了解决这个问题而设计的。
原子类型能够保证读写操作的原子性,即一个线程执行读写操作时,其他线程不能同时进行读写操作,从而保证数据的一致性。原子类型的实现通常依赖于硬件提供的原子指令或操作系统提供的原子操作接口。
atomic
std::atomic 是 C++11 引入的原子类型,用于实现多线程并发访问共享变量时的同步与互斥。std::atomic 实现了原子操作的语义,能够保证在多线程并发访问时,操作的正确性与数据的一致性。
std::atomic 的模板参数可以是 C++ 中的标量类型,如整型、浮点型等,也可以是自定义的结构体、类等。使用 std::atomic 定义的变量在读写操作时会自动进行同步与互斥。
下面是 std::atomic 的一些常用方法:
- load():从原子对象中读取当前值,并返回该值;
- store(val):将原子对象的值设置为 val;
- exchange(val):将原子对象的值设置为 val,并返回原来的值;
- fetch_add(delta):将原子对象的值增加 delta,并返回原来的值;
- fetch_sub(delta):将原子对象的值减少 delta,并返回原来的值;
- fetch_and(val):将原子对象的值与 val 进行按位与操作,并返回原来的值;
- fetch_or(val):将原子对象的值与 val 进行按位或操作,并返回原来的值;
- fetch_xor(val):将原子对象的值与 val 进行按位异或操作,并返回原来的值。
注意:
在使用 std::atomic 时,需要确保在多线程并发访问时,所有线程都使用了原子类型进行读写操作,否则可能会导致竞争条件或数据一致性问题。此外,在使用 std::atomic 时,需要考虑其原子性与内存顺序的问题,以确保操作的正确性。