MacOSX:OSAtomic与OSAtomicBarrier

ano*_*non 11 macos

对于这里的功能:

#include <libkern/OSAtomic.h>
Run Code Online (Sandbox Code Playgroud)

有OSAtomic和OSAtomicBarrier版本.

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

  1. 什么时候安全使用OSAtomic,没有OSAtomicBarrier版本
  2. 什么时候这OSAtomic将是不安全的,但OSAtomicBarrier将是安全的.

谁能提供解释+样本代码?

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

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

Whi*_*ind 7

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

对于多处理器系统的PPC,你应该总是使用屏障多种功能,除非原子店不影响任何数据的其他比原子变量.

以下不可行:

data_structure[y].data++;
OSAtomicIncrement32(y);
Run Code Online (Sandbox Code Playgroud)

必须在此处使用屏障,因为其他线程可能会将data_structure视为过时.

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

// y is not used to access any other data
OSAtomicIncrement32(y);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为什么英特尔多处理器系统无关紧要? (2认同)