我什么时候需要使用primefaces<bool>而不是bool?
不是atomic<bool>
冗余,因为bool
本质上是primefaces? 我不认为有可能有一个部分修改布尔值。 我什么时候需要使用atomic<bool>
而不是bool
?
C ++中没有任何types是“primefaces性的”,除非它是std::atomic*
-something。 那是因为标准是这样说的。
实际上,操作std::atomic<bool>
的实际硬件指令可能(也可能不)与普通的bool
,但是primefaces是一个更大的概念,具有更广的分支(例如限制编译器重新sorting)。 此外,一些操作(如否定)在primefaces操作上被重载,以在硬件上创build与非primefacesvariables的本地,非primefaces读取 – 修改 – 写入序列完全不同的指令。
记住关于记忆障碍 。 尽pipe部分地改变bool
是不可能的,但是多处理器系统有可能在多个副本中有这个variables,并且一个线程即使在另一个线程将它改变为新的值之后仍然可以看到旧值。 primefaces引入记忆障碍,所以变得不可能。
C ++的primefacestypes处理三个潜在的问题。 首先,如果操作需要一个以上的总线操作(这可能发生在一个bool
,取决于如何实现),则可以通过任务切换来撕开读或写。 其次,读取或写入可能仅影响与正在执行操作的处理器相关联的高速caching,而其他处理器可能在其高速caching中具有不同的值。 第三,如果编译器不影响结果,编译器可以重新排列操作的顺序(约束稍微复杂一些,但现在已经足够了)。
你可以自己处理这三个问题,通过假设你正在使用的types是如何实现的,通过明确地清空caching,并使用特定于编译器的选项来防止重新sorting(而且,不, volatile
不会除非你的编译器文档说明了这一点)。
但为什么要经历这一切呢? atomic
为你照顾,并且可能比你自己做得更好。
primefaces行动不仅仅是被撕裂的价值观,所以我同意你和其他海报的意见,我不知道有一个可能的bool
环境。
香草萨特给了你一个很好的谈话,你可以在网上查看。 被警告,这是一个漫长而涉及的话题。 草药萨特,primefaces武器 。 这个问题归结为避免数据竞赛,因为它可以让你有顺序一致性的错觉。
考虑比较和交换操作:
bool a = ...; bool b = ...; if (a) swap(a,b);
在我们读了一个之后,我们变成了真的,另外一个线程可以出现并设置一个假的,然后我们交换(a,b),所以在退出b之后是假的,即使交换了。
使用std::atomic::compare_exchange
我们可以自动完成整个if / swap逻辑,以便另一个线程不能在if和swap(不locking)之间设置为false。 在这种情况下,如果交换的是b,在退出时必须是错误的。
这只是应用于两个值types(如bool)的primefaces操作的一个示例。
某些types的primefaces性完全取决于底层硬件。 每种处理器架构对某些操作的primefaces性有不同的保证。 例如:
Intel486处理器(以及更新的处理器)保证了以下基本的内存操作将始终以primefaces方式进行:
- 读或写一个字节
- 读取或写入在16位边界上alignment的单词
- 读取或写入在32位边界上alignment的双字
其他体系结构有不同的规范,哪些操作是primefaces性的。
C ++是一种高级编程语言,致力于将您从底层硬件中抽象出来。 出于这个原因,标准根本不能允许人们依赖这样的低级假设,否则你的应用程序将不可移植。 因此,C ++中的所有基元types都是由C ++ 11兼容的标准库开箱即用的atomic
types提供的。
- 为什么GCC -O3在filter迭代器上通过std :: deque产生无限的std :: distance?
- 为什么在Herb Sutter的CppCon 2014演讲中不推荐使用setter成员函数(回到基础:现代C ++风格)?
- 如何在C ++ 11中终止一个线程?
- 正则expression式比python慢
- dynamicalignment的内存分配在C + + 11
- 在C ++ 11中本地静态variables初始化是线程安全的吗?
- 是否有可能写一个函数模板,返回参数的数量是否可以被N整除?
- 获得时间以来,以毫秒为单位,最好使用C ++ 11 chrono
- 为什么std :: function不平等?