Joh*_*n K 10 multithreading caching objective-c ios cpu-cache
Apple提供了一些有关同步变量甚至执行顺序的文档.我没看到的是有关CPU缓存行为的任何文档.Objective-C开发人员有什么保证和控制来确保线程之间的缓存一致性?
考虑以下情况,其中变量在后台线程上设置但在主线程上读取:
self.count = 0;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
self.count = 5;
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%i", self.count);
});
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是否应该计数?
更新1
线程间通信中的文档保证共享变量可用于线程间通信.
在两个线程之间传递信息的另一种简单方法是使用全局变量,共享对象或共享内存块.
在这种情况下,这不是必需的吗?这与内存屏障和易失性变量中的文档相矛盾:
但是,如果该变量在另一个线程中可见,则此类优化可能会阻止另一个线程注意到对它的任何更改.将volatile关键字应用于变量会强制编译器在每次使用时从内存加载该变量.
因此,我仍然不知道是否需要volatile,因为编译器可以使用寄存器缓存优化,或者如果不需要,因为编译器以某种方式知道它是"共享"的东西.
关于共享变量是什么或者编译器如何知道它的文档不是很清楚.在上面的例子中,是否计算共享对象?假设count是一个int,那么它不是一个对象.它是共享的内存块还是只适用于__block声明的变量?对于非块,非对象,非全局共享变量,可能需要volatile.
更新2
对于每个人来说,这是一个关于同步的问题,但事实并非如此.这是关于iOS平台上的CPU缓存行为.
小智 0
您应该使用锁或其他同步机制来保护共享变量。根据文档它说:
在两个线程之间传递信息的另一种简单方法是使用全局变量、共享对象或共享内存块。尽管共享变量快速且简单,但它们也比直接消息传递更脆弱。必须使用锁或其他同步机制仔细保护共享变量,以确保代码的正确性。否则可能会导致竞争条件、数据损坏或崩溃。
事实上,保护计数器变量的最佳方法是使用原子操作。您可以阅读这篇文章:https://www.mikeash.com/pyblog/friday-qa-2011-03-04-a-tour-of-osatomic.html
归档时间: |
|
查看次数: |
560 次 |
最近记录: |