|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
可能一些鱼油会觉得,64位和32位是一样的,其实不是的。如果你直接赋一个64位的值给InterlockedExchangeAdd,你的VS可能会报错:
“初始化”: 从“__int64”到“int”截断
于是,64位版int(__int64)便诞生了
还是举个栗子
- #include<Windows.h>
- volatile long l = 0;
- int main(){
- InterlockedExchangeAdd(&l, 283498282349);
- return 0;
- }
复制代码
这样,VS编译就多了几个警告:
- 1>------ 已启动生成: 项目: 原子访问, 配置: Release Win32 ------
- 1> 源.cpp
- 1>源.cpp(4): warning C4305: “参数”: 从“__int64”到“LONG”截断
- 1>源.cpp(4): warning C4309: “参数”: 截断常量值
- ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
复制代码
然后,l就会不断溢出然后变成最小值又溢出又变成最小值,所以l的值不可能是2930923919239!
改进版:
- #include<Windows.h>
- volatile __int64 i = 0;//__int64是64位版的int
- int main(){
- InterlockedAdd64(&i, 283498282349);
- return 0;
- }
复制代码
现在就没有警告了。
64位原子访问基本与32位原子访问相同,只不过是要用__int64而已。
64位原子访问函数:
InterlockedAdd64 | 递增一个64位值 |
88888~
|
|