问题 MacOSX:OSAtomic与OSAtomicBarrier


对于这里的功能:

#include <libkern/OSAtomic.h>

有OSAtomic和OSAtomicBarrier版本。

但是,文档未显示以下示例代码:

  1. 什么时候使用它是安全的 OSAtomic,没有 OSAtomicBarrier 版
  2. 什么时候那样 OSAtomic 将会 不安全但是 OSAtomicBarrier 会安全的。

任何人都可以提供解释+样本代码吗?

[没有实际代码的“你的意见”的随机漫游是无用的。读者:请投下这样的答案;并用实际代码充满活力地回答。]

[C / C ++代码首选;大会也好。]


12862
2018-03-12 23:19


起源



答案:


在英特尔和单处理器平台上,无所谓。

对于多处理器PPC系统,除非原子存储不影响任何数据,否则应始终使用各种各样的函数 其他 比原子变量。

以下是不可行的:

data_structure[y].data++;
OSAtomicIncrement32(y);

必须 在这里使用障碍,因为其他线程可能会将data_structure视为过时。

但是,如果您将某个原子变量用于某些目的,那么您可以忽略该障碍:

// y is not used to access any other data
OSAtomicIncrement32(y);

很好,只要y的值不影响任何共享数据结构的变量。

从本质上讲,它是缓存刷新。您始终可以安全地使用屏障功能,但在某些情况下,您可以通过不使用屏障功能来提高性能,例如,如果不相对于数据结构使用y。可能没有很多情况下您可以使用没有屏障的功能。


7
2018-03-31 21:43



为什么英特尔多处理器系统无关紧要? - anon
这可以比我更好地解释它: linuxjournal.com/article/8211 - WhirlWind
以下情况不会成立:data_structure [y] .data ++; OSAtomicIncrement32(Y);下一个代码也不行:data_structure [y] .data ++; OSAtomicIncrement32Barrier(Y); - Speakus
@Speakus然后,什么是OK版本? - Eonil


答案:


在英特尔和单处理器平台上,无所谓。

对于多处理器PPC系统,除非原子存储不影响任何数据,否则应始终使用各种各样的函数 其他 比原子变量。

以下是不可行的:

data_structure[y].data++;
OSAtomicIncrement32(y);

必须 在这里使用障碍,因为其他线程可能会将data_structure视为过时。

但是,如果您将某个原子变量用于某些目的,那么您可以忽略该障碍:

// y is not used to access any other data
OSAtomicIncrement32(y);

很好,只要y的值不影响任何共享数据结构的变量。

从本质上讲,它是缓存刷新。您始终可以安全地使用屏障功能,但在某些情况下,您可以通过不使用屏障功能来提高性能,例如,如果不相对于数据结构使用y。可能没有很多情况下您可以使用没有屏障的功能。


7
2018-03-31 21:43



为什么英特尔多处理器系统无关紧要? - anon
这可以比我更好地解释它: linuxjournal.com/article/8211 - WhirlWind
以下情况不会成立:data_structure [y] .data ++; OSAtomicIncrement32(Y);下一个代码也不行:data_structure [y] .data ++; OSAtomicIncrement32Barrier(Y); - Speakus
@Speakus然后,什么是OK版本? - Eonil


我认为这篇文章更详细地解释了这里发生了什么: http://www.mikeash.com/pyblog/friday-qa-2011-03-04-a-tour-of-osatomic.html。很好读。


4
2017-08-27 23:52