用户模式下的线程同步(一)——Interlocked系列函数

1. 原子访问:Interlocked系列函数——Interlocked系列函数会以原子方式来操控一个值。
// 传一个长整形变量的地址和另一个增量值,函数就会保证递增操作是以原子方式进行的。
LONG InterlockedExchangeAdd(PLONG volatile plAddend,LONG lIncrement);

LONGLONG InterlockedExchangeAdd64(PLONGLONG 
volatile pllAddend,LONGLONG llIncrement);

//InterlockedIncrement函数以原子方式给一个值加1。
LONG InterlockedIncrement(IN PLONG Addend);

//InterlockedExchange和InterlockedExchangePointer会把第一个参数所指向的内存地址的当前值,以原子方式替换为第二个参数指定的值。
LONG InterlockedExchange(OUT PLONG Target,IN LONG Value);

LONGLONG InterlockedExchange64(PLONGLONG 
volatile plTarget,LONGLONG lValue);

PVOID InterlockedExchangePointer(PVOID
* volatile ppvTarget,PVOID pvValue);
//这两个函数都会返回原来的值。


// InterlockedCompareExchange和InterlockedCompareExchangePointer函数以原子方式执行一个测试和设置操作。
PVOID InterlockedCompareExchange(PLONG plDestination,LONG lExchange,LONG lComparand);

PVOID InterlockedCompareExchangePointer(PVOID
* ppvDestination,PVOID pvExchange,PVOID pvComparand);
注意:我们必须确保传给这些函数的变量地址是经过对齐的,否则这些函数可能会失败。
C运行库提供了一个_aligned_malloc函数,我们可以使用这个函数来分配一块对齐过的内存:
void * _aligned_malloc(size_t size,size_t alignment);
// size表示要分配的字节数。
// alignment表示要对齐到的字节边界,传给alignment参数的值必须是2的整数幂次方

Interlocked单向链表函数——对Interlocked单向链表的栈进行操作,栈中的每个操作,比如入栈或出栈,必定是以原子方式进行的。
InitializeSListHead    // 创建一个空栈
InterlockedPushEntrySList  // 在栈顶添加一个元素
InterlockedPopEntrySList    // 移除位于栈顶的元素并将它返回
InterlockedFlushSList     // 清空栈
QueryDepthSList    // 返回栈中元素的数量

posted on 2011-12-12 10:10 梦五 阅读(729) 评论(0)  编辑 收藏 引用 所属分类: Windows相关


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜