对于这里的功能:
#include <libkern/OSAtomic.h>
有OSAtomic和OSAtomicBarrier版本。
但是,文档未显示以下示例代码:
OSAtomic
,没有OSAtomicBarrier
版本OSAtomic
何时不安全,但OSAtomicBarrier
是安全的。任何人都可以提供解释+样本代码吗?
[没有实际代码的“你的意见”的随机漫游是无用的。读者:请投下这样的答案;并用实际代码充满活力地回答。]
[C / C ++代码首选;大会也没关系。]
答案 0 :(得分:7)
在英特尔和单处理器平台上,无所谓。
对于多处理器PPC系统,除非原子存储不影响原子变量 other ,否则应始终使用各种各样的函数。
以下情况不会:
data_structure[y].data++;
OSAtomicIncrement32(y);
你必须在这里使用障碍,因为其他线程可能会将data_structure视为过时。
但是,如果您将某个原子变量用于某些目的,那么您可能会忽略该障碍:
// y is not used to access any other data
OSAtomicIncrement32(y);
很好,只要y的值不影响任何共享数据结构的变量。
基本上,它是缓存刷新。您始终可以安全地使用屏障功能,但在某些情况下,您可以通过不使用屏障功能来提高性能,例如,如果不相对于数据结构使用y。可能没有多少情况下您可以使用没有屏障的功能。
答案 1 :(得分:4)
我认为这篇文章更详细地解释了这里发生了什么:http://www.mikeash.com/pyblog/friday-qa-2011-03-04-a-tour-of-osatomic.html。非常好读。