win32API之InterlockedExchangeAdd

本文介绍了 InterlockedExchangeAdd() 函数,一种用于解决多线程环境下变量相加操作时的互斥问题的方法。该函数可以替代信号量或互斥锁等复杂机制,简化同步代码。文章通过示例讲解了如何使用此函数来更新全局变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 InterlockedExchangeAdd()函数是解决互斥的一个简单方法,与信号量,互斥作用相当。

原型如下:

LONG InterlockedExchangeAdd(PLONG Addend, LONG Value);

该函数可实现对一个long型变量的相加操作。

第一个参数 是传入的一个长整形变量
第二个参数 是每次操作递增的量值

 

例子:

long g_iData = 0;       // 全局变量

// 线程体
unsigned int __stdcall ThreadFunc(void* param)
{
    InterlockedExchangeAdd(&g_iData, 2);
    return 0;
}


执行完 InterlockedExchangeAdd 

g_iData 增加2

C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9878): error C2065: “InterlockedIncrement64”: 未声明的标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9910): error C2065: “InterlockedDecrement64”: 未声明的标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9946): error C3861: “InterlockedExchange64”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(10000): error C3861: “InterlockedExchangeAdd64”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(10010): error C3861: “InterlockedExchangeAdd64”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(10057): error C3861: “InterlockedAnd64”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(10067): error C3861: “InterlockedOr64”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(10077): error C3861: “InterlockedXor64”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt\wrl\implements.h(1570): error C3861: “InterlockedCompareExchangeNoFence”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt\wrl\implements.h(1588): error C3861: “InterlockedCompareExchangeRelease”: 找不到标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt\wrl\implements.h(1874): error C2065: “_ARM64_BARRIER_ISH”: 未声明的标识符 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt\wrl\implements.h(1874): error C3861: “__dmb”: 找不到标识符 src\Candidate\EnumTfCandidates.cpp(78): error C2665: “InterlockedIncrement”: 没有重载函数可以转换所有参数类型 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9874): note: 可能是“unsigned __int64 InterlockedIncrement(volatile unsigned __int64 *)” src\Candidate\EnumTfCandidates.cpp(78): note: “unsigned __int64 InterlockedIncrement(volatile unsigned __int64 *)”: 无法将参数 1 从“LONG *”转换为“volatile unsigned __int64 *” src\Candidate\EnumTfCandidates.cpp(78): note: 指向的类型不相关; 转换需要 reinterpret_cast、C 样式强制转换或带圆括号的函数样式强制转换 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9862): note: 或 “unsigned long InterlockedIncrement(volatile unsigned long *)” src\Candidate\EnumTfCandidates.cpp(78): note: “unsigned long InterlockedIncrement(volatile unsigned long *)”: 无法将参数 1 从“LONG *”转换为“volatile unsigned long *” src\Candidate\EnumTfCandidates.cpp(78): note: 指向的类型不相关; 转换需要 reinterpret_cast、C 样式强制转换或带圆括号的函数样式强制转换 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9853): note: 或 “unsigned int InterlockedIncrement(volatile unsigned int *)” src\Candidate\EnumTfCandidates.cpp(78): note: “unsigned int InterlockedIncrement(volatile unsigned int *)”: 无法将参数 1 从“LONG *”转换为“volatile unsigned int *” src\Candidate\EnumTfCandidates.cpp(78): note: 指向的类型不相关; 转换需要 reinterpret_cast、C 样式强制转换或带圆括号的函数样式强制转换 src\Candidate\EnumTfCandidates.cpp(78): note: 尝试匹配参数列表“(LONG *)”时 src\Candidate\EnumTfCandidates.cpp(83): error C2665: “InterlockedDecrement”: 没有重载函数可以转换所有参数类型 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9906): note: 可能是“unsigned __int64 InterlockedDecrement(volatile unsigned __int64 *)” src\Candidate\EnumTfCandidates.cpp(83): note: “unsigned __int64 InterlockedDecrement(volatile unsigned __int64 *)”: 无法将参数 1 从“LONG *”转换为“volatile unsigned __int64 *” src\Candidate\EnumTfCandidates.cpp(83): note: 指向的类型不相关; 转换需要 reinterpret_cast、C 样式强制转换或带圆括号的函数样式强制转换 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9894): note: 或 “unsigned long InterlockedDecrement(volatile unsigned long *)” src\Candidate\EnumTfCandidates.cpp(83): note: “unsigned long InterlockedDecrement(volatile unsigned long *)”: 无法将参数 1 从“LONG *”转换为“volatile unsigned long *” src\Candidate\EnumTfCandidates.cpp(83): note: 指向的类型不相关; 转换需要 reinterpret_cast、C 样式强制转换或带圆括号的函数样式强制转换 C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um\winbase.h(9885): note: 或 “unsigned int InterlockedDecrement(volatile unsigned int *)” src\Candidate\EnumTfCandidates.cpp(83): note: “unsigned int InterlockedDecrement(volatile unsigned int *)”: 无法将参数 1 从“LONG *”转换为“volatile unsigned int *” src\Candidate\EnumTfCandidates.cpp(83): note: 指向的类型不相关; 转换需要 reinterpret_cast、C 样式强制转换或带圆括号的函数样式强制转换 src\Candidate\EnumTfCandidates.cpp(83): note: 尝试匹配参数列表“(LONG *)”时 > in src\Candidate\EnumTfCandidates.cpp PS D:\Downloads\MetasequoiaImeTsf-master\MetasequoiaImeTsf - 副本>
最新发布
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值