对于64位Windows上的32位应用程序,64位操作是原子的

时间:2014-12-17 19:46:14

标签: windows visual-c++ 32bit-64bit atomicity

因此,本文档称运行64位Windows为您提供64位原子性:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122%28v=vs.85%29.aspx

这篇文章表明您必须运行64位应用才能获得64位原子性:atomicity in 32/64 bit

我正在开发一个Win32控制台应用。所以,如果我理解正确,我必须使用32位类型来获得原子性,对吧?我不能假设64位类型有原子写/读?

1 个答案:

答案 0 :(得分:4)

在64位应用程序中,64位读/写操作可以是自动的,因为编译器可以利用具有原子64位读/写操作的x64扩展指令集。

在64位操作系统和32位代码中。另一方面,如果应用程序需要读/写64位数据,则​​不存在64位读/写指令,因此编译器必须生成(至少)两次读/写操作。由于操作系统可以在两次读/写之间抢占进程,因此您应该使用Interlockedxxx API。

注意:如果需要,您可以构建64-bit Win32 console apps。在这种情况下,编译器可以生成使用64位读/写操作的代码。

当然,由于你的代码可能想要读/写大于64位的数据类型(例如SSE2 / 3,AVX等),因此需要多个读/写操作,你应该{ {3}}以确保所需的操作是原子的。

我建议您不要假设您可以依赖编译器为您的特定场景做正确的事情,而是建议使用必要的API和内在函数来明确声明您的哪些操作必须是原子的。这样您就不会关心代码是否针对x64,x64,ARM,MIPS等编译。