InterlockedCompareExchange 原子操作

LONG
  InterlockedCompareExchange(
    IN OUT PLONG  Destination,
    IN LONG  Exchange,
    IN LONG  Comparand
    );

Destination
指向一个要被比较的值,这是一个指针
Exchange
如果Destion与Comapradn相等,那么Destination的值等于此值
Comparand
与Destionation比较的值
Return Value
返回原来Desination指向的值


注:
如果Destion与Comparand相等,那么就把Destion置为Exchange,其他情况,Destination不变。反回的是原来Destation指向的值,这点一定要注意。
此函数线程安全,为原子操作,用在多线程中。
样例代码:

#include <iostream>
#include <windows.h>
int main()
{
	using std::cout;
	using std::endl;
	unsigned int des = 3;
	unsigned int a,b;
	a = 2, b = 3;
	cout << ::InterlockedCompareExchange(&des, a, b) << endl;
	cout << des << endl;
	cout << a << endl;
	cout << b << endl;
	return 0;
}
### Windows 平台下原子操作的实现与使用方法 在多线程编程中,原子操作是确保线程安全的重要手段之一。Windows 提供了一系列内置的原子操作函数,这些函数通过硬件支持和操作系统级别的封装来保证操作原子性。以下是关于 Windows 平台下原子操作的实现与使用方法的详细说明。 #### 1. 原子操作函数概述 Windows 提供了多个原子操作函数,用于处理常见的同步需求。这些函数包括但不限于以下几种: - **InterlockedExchange**: 将目标操作数与一个值交换,并返回目标操作数的原始值[^3]。 - **InterlockedCompareExchange**: 比较目标操作数与一个值,如果相等,则将目标操作数替换为另一个值,并返回目标操作数的原始值[^3]。 - **InterlockedIncrement**: 对目标操作数加 1。 - **InterlockedDecrement**: 对目标操作数减 1[^3]。 - **InterlockedExchangeAdd**: 将目标操作数加上一个指定值,并返回目标操作数的原始值[^3]。 - **InterlockedExchangePointer**: 将目标指针设置为一个新的指针值,并返回原始指针值[^3]。 这些函数通常用于实现线程间的同步机制,例如自旋锁、信号量等。 #### 2. 原子操作函数的使用示例 以下是一些常见的使用场景及代码示例: ##### (1) 使用 `InterlockedIncrement` 实现线程安全的计数器 ```c #include <windows.h> #include <stdio.h> LONG counter = 0; DWORD WINAPI ThreadFunc(LPVOID lpParam) { for (int i = 0; i < 1000; ++i) { InterlockedIncrement(&counter); } return 0; } int main() { HANDLE threads[10]; for (int i = 0; i < 10; ++i) { threads[i] = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL); } WaitForMultipleObjects(10, threads, TRUE, INFINITE); printf("Final Counter Value: %ld\n", counter); return 0; } ``` 上述代码展示了如何通过 `InterlockedIncrement` 函数实现线程安全的计数器。 ##### (2) 使用 `InterlockedCompareExchange` 实现 CAS(Compare And Swap) CAS 是实现自旋锁的基础,其核心思想是比较目标值与期望值是否相等,若相等则更新为目标值[^2]。 ```c #include <windows.h> #include <stdio.h> LONG globalValue = 0; BOOL TryUpdateValue(LONG oldValue, LONG newValue) { return InterlockedCompareExchange(&globalValue, newValue, oldValue) == oldValue; } int main() { if (TryUpdateValue(0, 42)) { printf("Value updated successfully to 42.\n"); } else { printf("Failed to update value.\n"); } return 0; } ``` 此示例演示了如何使用 `InterlockedCompareExchange` 来实现 CAS 操作[^2]。 #### 3. 原子操作的底层实现原理 Windows 的原子操作函数基于处理器提供的硬件指令集实现。例如,在 x86 架构中,`lock` 前缀被用于确保指令的原子性。具体来说,`InterlockedExchange` 和 `InterlockedCompareExchange` 等函数会调用类似的汇编指令。 以下是一个简单的汇编代码示例,展示如何通过 `lock xadd` 指令实现原子加法[^2]: ```asm __asm__ volatile( "lock; xaddl %2, %1;" : "=a"(old) : "m"(*value), "a"(add) : "cc", "memory" ); ``` #### 4. 注意事项 - 原子操作虽然高效,但并非适用于所有场景。对于复杂的同步需求,可能需要结合其他同步机制(如互斥锁或事件)。 - 在高并发场景下,过度依赖原子操作可能导致性能瓶颈,需谨慎评估其适用性[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值