mba*_*ows 2 multithreading objective-c
OSAtomicIncrement32 锁定什么?Dispatch_async 是否会导致原子调用对于原始变量来说不是线程安全的?
static volatile int32_t count;
...
dispatch_async(dispatch_get_main_queue(), ^{
...
OSAtomicIncrement32(&count);
}
Run Code Online (Sandbox Code Playgroud)
易失性是否多余,或者即使计数始终以原子方式递增,某些线程也可以读取旧值?
编辑:不稳定的问题已由http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484解决。这可以通过以下答案中的几个链接找到,但我想我会将其发布在这里以供快速参考。简而言之,“易失性”在 Java 中与 Objective-C 中的含义不同。
来自苹果文档:
非阻塞同步是一种执行某些类型的操作并避免锁开销的方法。尽管锁是同步两个线程的有效方法,但即使在无竞争的情况下,获取锁也是一个相对昂贵的操作。相比之下,许多原子操作只需一小部分时间即可完成,并且与锁一样有效。
原子运算允许您对 32 位或 64 位值执行简单的数学和逻辑运算。这些操作依赖于特殊的硬件指令(以及可选的内存屏障)来确保给定的操作在再次访问受影响的内存之前完成。在多线程情况下,您应该始终使用包含内存屏障的原子操作,以确保内存在线程之间正确同步。
因此,您应该使用它OSAtomicIncrement32Barrier来确保线程之间共享的内存正确同步。根据这个答案,只有当参数不用于访问任何其他数据时,才应该使用非屏障函数
请参阅有关原子操作关键字使用的问题的答案。volatile