15.2  顺序及一致性

15.2 顺序及一致性

枚举类型变量memory_order指明了详细的、标准化的内存同步顺序,也提供了运行的次序。其各个枚举值及其意义前面已经有所讲述。需要特别注意的是,即使是采用memory_order_relaxed的序形式,也要保证原子类型数据访问的不可拆分性。

该枚举类型为:

978-7-111-51399-5-Chapter15-34.jpg

原子操作的release类型操作是和acquire类型操作相对应的。对于原子类型对象M,当原子操作A是release类型时,其同步的原子操作B肯定是在执行acquire类型操作。

如果在多个线程中对原子类型或其相关类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证多个线程访问这个共享资源的正确性,从而避免了锁的使用,提高了效率。

使用内存序规则时,默认规则都是std::memory_order_seq_cst。此外,atomic还有一些标识类型和测试操作,比较类似操作系统里的原子操作std::atomic_flag。其他规则用来放宽顺序一致性以从无锁算法中获得更好的性能。

提示

volatile是一个类型修饰符。volatile被设计用来修饰被不同线程访问和修改的变量。在编写多线程程序时,如果不使用volatile,可能会导致无法编写多线程程序或者会导致编译器失去大量优化的机会。