Objective c OSAtomicIncrement32锁定了什么?
OSAtomicIncrement32锁定了什么?dispatch_async是否会导致原始变量的原子调用不是线程安全的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总是以原子方式递增,某些线程也会读取旧值吗 编辑:易变的问题已由管理员澄清。这可以通过
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标准经济学