对于同步,c++11添加了几个原子类型,类型如下atomic_xxx(atomic_int等),对于一般的线程之间的同步,只需要使用它们即可。
对于内存模型,如果是采用了弱顺序的内存模型,则在多个原子类型的操作顺序进行了重排,例如:
atomic_int x;
atomic_int y;
x = 1;
y=2;
上面的对x,y进行的赋值顺序可能是:y=2;x=1;
在c++11中,原子类型的成员函数总是保证顺序的一致性,这样,既禁止了编译器对原子类型变量间的重排序优化;但是对于像PowerPC这样的平台来说,不仅禁止了编译器的优化,还插入了大量的内存栅栏(对多线程而言,有很大的性能伤害)。
对于atomic_int的操作可以是(load取),(store存)。
内存顺序由6种:
memory_order_relaxed 不对顺序做任何保障。
memory_order_acquire 在本线程中,后续的读操作必须在本操作结束后执行。
memory_order_release 所有之前的写操作完成之后才能进行本操作。
memory_order_acq_rel 同时包含memory_order_acquire和memory_order_release。
memory_order_consume 本线程中,所有的后续有关本原子类型的操作,必须在本条原子操作完成之后执行。
memory_order_seq_cst 全部存取都按顺序执行。