Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c OSAtomicIncrement32锁定了什么?_Objective C_Multithreading - Fatal编程技术网

Objective c OSAtomicIncrement32锁定了什么?

Objective c OSAtomicIncrement32锁定了什么?,objective-c,multithreading,Objective C,Multithreading,OSAtomicIncrement32锁定了什么?dispatch_async是否会导致原始变量的原子调用不是线程安全的 static volatile int32_t count; ... dispatch_async(dispatch_get_main_queue(), ^{ ... OSAtomicIncrement32(&count); } volatile是冗余的,或者即使count总是以原子方式递增,某些线程也会读取旧值吗 编辑:易变的问题已由管理员澄清。这可以通过

OSAtomicIncrement32锁定了什么?dispatch_async是否会导致原始变量的原子调用不是线程安全的

static volatile int32_t count;
...
dispatch_async(dispatch_get_main_queue(), ^{
  ...
  OSAtomicIncrement32(&count);
}
volatile是冗余的,或者即使count总是以原子方式递增,某些线程也会读取旧值吗

编辑:易变的问题已由管理员澄清。这可以通过以下几个链接找到答案,但我想我会把它贴在这里以供快速参考。简而言之,“volatile”在Java中的含义与Objective-C中的含义不同。

来源:

非阻塞同步是执行某些类型同步的一种方法 操作,避免锁的费用。虽然锁是一种 获取锁是同步两个线程的有效方法 相对昂贵的操作,即使在无争议的情况下。通过 相比之下,许多原子操作只需花费一小部分时间即可完成 完整,可以像锁一样有效

原子操作允许您执行简单的数学和逻辑操作 对32位或64位值的操作。这些行动依赖于 特殊硬件说明(和可选内存屏障)用于 确保给定的操作在受影响的内存恢复之前完成 再次访问。在多线程情况下,应始终使用 包含内存屏障的原子操作,以确保 内存在线程之间正确同步

因此,您应该使用
osatomiciincrement32载体
,以确保线程之间共享的内存正确同步。根据,只有当参数不用于访问任何其他数据时,才应该使用非屏障函数


请参阅有关原子操作的
volatile
关键字用法的答案。

它不会锁定任何内容。它使用一条CPU指令来更新内存,并使其他CPU/cores/etc看到新值。还请注意,自macOS 10.12起,
OSAtomic
。。。API已经被弃用,取而代之的是内核的
原子函数。请参见
man 3标准经济学