Win32多线程之Interlocked Variables
来源:互联网 发布:成人频道直播软件 编辑:程序博客网 时间:2024/06/01 09:57
同步机制的最简单类型就是使用interlocked 函数,对着标准的32位变量进行操作。这些函数并没有提供“等待”机能,它们只是保证对某个特定变量的存取操作时“一个一个按顺序来”。
考虑一下,如果你需要维护一个32位计数器的“排他性 存取”性质,你该怎么做?你可能会产生一个critical section或一个mutex,拥有它,然后进行你的操作,然后再释放拥有权,一个32位变量的存取操作只需要2-3个机器指令,因此上述的准备实在是太多了些,几乎呈现两个order的倍数。
类似的32位计数器发生在所谓的引用计数(reference counting )身上,例如系统核心对于核心对象的handle的处理,基本上当一个核心对象的引用计数为0时,这个对象就应该被摧毁,你可以“要么降低其引用计数值”,“要么判断它是否等于0”,但是没办法两者并行。
InterlockedDecrement()可以双效合一,它先将计数器内容减1,再将其值与0做比较,并且传回比较结果。
所谓的interlocked函数,共有两个:
1) InterlockedIncrement()
2)InterlockedDecrement()
这两个函数都只能够和0作比较,不能和任何其他数值比较。
Long InterlockedIncrement(
LPLONG lpTarget
);
Long InterlockedDecrement(
LPLONG lpTarget
);
参数:lpTarget 32位变量的地址,这个变量内容将被递增或递减,结果将与0作比较。这个地址必须指向long word。
返回值
变量经过运算(加1或减1)后,如果等于0,传回0;如果大于0,传回一个正值:如果小于0,传回一个负值。
Interlocked...()函数的传回值代表计数器和0的比较结果,这一点对于实现我们曾经提过的所谓“引用计数”(reference counting)非常重要,因为我们必须知道“引用计数”(reference counting)非常重要,因为我们必须知道“引用计数”何时到达0,如果没有这个比较,问题就回到了原点。你必须在增减操作之前先锁定该计数器,以便增减操作成为一个“不可切割”的操作。
InterlockedExchange()可以设定一个新值,并传回旧值。就像InterlockedIncrement()和InterlockedDecrement()一样。他提供了一个在多线程环境下的安全做法,用以完成一个很基础的运算操作。
LONG InterlockedExchange(
LPLONG lpTarget,
LONG lValue
);
参数
lpTarget 32位变量的地址,这个指针必须指向long word
lValue 用以取代lpTarget 所指内容的新值。
返回值
传回先前由lpTarget所指的内存。
- Win32多线程之Interlocked Variables
- 《Win32多线程程序设计》(8)---Interlocked Variables
- 多线程之三 原子操作 Interlocked系列函数
- C++ 之 原子操作 Interlocked系列函数多线程(四)
- Win32多线程之概述
- Win32多线程之分类
- Win32多线程之进程
- Win32多线程之CreateThread
- Win32多线程之GetExitCodeThread
- Win32多线程之ExitThread
- Win32多线程之WaitForMultipleObjects
- Win32多线程之volatile
- C#多线程:Interlocked类操作
- 多线程编程学习笔记-interlocked
- 【多线程】(二)Interlocked系列函数
- windows多线程:Interlocked系列函数
- 多线程、进程(二Interlocked)
- Win32多线程之原子操作
- Evaluate Reverse Polish Notation | leetcode
- eclipse常用快捷键
- 3143 二叉树的序遍历(维基oi)
- 数据结构-串-KMP模式匹配算法
- hdu1827Summer Holiday
- Win32多线程之Interlocked Variables
- 读取文本文件1
- winMerge设置字符编码
- HttpWebResponse类的常用属性和方法
- Linear Spatial Pyramid Matching Using Sparse Coding for Image Classification代码解
- hdu4126 Genghis Khan the Conqueror 树形dp+最小生成树
- C#调用C++方法,C#使用c++方法返回类或结构体
- 随笔
- Google矩阵