阅读C++11 I的一份草案对第1.7.3条感兴趣:
内存位置要么是标量类型的对象,要么是相邻位字段的最大序列,它们都具有非零宽度。..。两个执行线程(1.10)可以更新和访问不同的内存位置,而不相互干扰。
此条款是否保护不受硬件相关的争用条件的影响,例如:
。
发布于 2012-06-05 12:39:59
关于第二点,标准保证那里不会有种族。尽管如此,有人告诉我,这种保证不是在当前的编译器中实现的,甚至可能无法在某些体系结构中实现。
关于第一点,如果第二点是有保证的,如果你的程序不包含任何竞赛条件,那么自然的结果就是这也不是比赛条件。也就是说,假设向不同子字位置写入的标准保证是安全的,那么唯一可以具有争用条件的情况是,如果多个线程访问相同的变量(跨单词拆分,或者更有可能是跨缓存行这是有问题的)。
同样,这可能很难,甚至不可能实现。如果您的未对齐数据穿过缓存线,那么几乎不可能保证代码的正确性而不给性能带来巨大的成本。由于这个原因和其他原因,您应该尽量避免未对齐的变量(包括原始性能,对对象的写入涉及到两个缓存行,涉及将多达32个字节写入内存,如果任何其他线程接触到任何缓存行,则还涉及缓存同步的成本.
发布于 2012-06-05 12:38:08
它不能防止内存撕裂,只有当两个线程访问相同的内存位置(但子句仅适用于不同的内存位置)时,才能看到内存撕裂。
根据您的例子,它似乎可以防止内存冲突。实现这一目标的最有可能的方法是,一个不能同时写入32位以下的系统将有32位char,然后两个单独的对象永远无法共享一个“系统内存单元”。(在具有32位char的系统上,两个16位整数可以相邻的唯一方法是作为位字段。)
https://stackoverflow.com/questions/10897093
复制相似问题