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缓存行为.
为什么外部div的填充会在下面的示例中折叠到内部div的边缘?
<!DOCTYPE html>
<html>
<head>
<title>Col Padding</title>
<link rel='stylesheet' type='text/css' media='all' href='http://meyerweb.com/eric/tools/css/reset/reset.css' />
<style type='text/css'>
.padding
{
padding: 50px;
background-color: green;
zoom: 1;
width: 500px;
}
.margin
{
margin: 100px;
background-color: blue;
}
</style>
</head>
<body>
<div class='padding'><div class='margin'>Content</div></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是在IE 7.0.5730.13中

这是在FF 6.0.2中

@David - idk我只有IE7
@Faust - 我现在附上了截图.我用XRAY检查了它们,看它们是不同的.
@veritas - 改变DOCTYPES似乎没有改变任何东西.我检查过,IE7正在标准模式下渲染.
我通过命令行移动了数千个文件,并将所有文件名打印到控制台.有没有办法忽略输出,所以它可以更快?在Linux中管道到/ dev/null之类的东西.
谢谢