发现一行没有见过的代码

pripor 2007-08-20 08:56:18
在狗狗上搜到了一个IOCP类的代码
打开看了看
有一行代码始终难以理解

InterlockedExchange((volatile long *)&m_State, m_State))

该类中这样代码经常出现,不知何意,哪一位大虾用过此方法,帮我解解惑???
...全文
377 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2007-08-21
  • 打赏
  • 举报
回复
应该是避免因为硬件修改或者优化导致数据不一致的情况
冷月清晖 2007-08-21
  • 打赏
  • 举报
回复
1.这个函数执行的操作可以安全地避开同步问题——即使是一个共享变量
2.在多线程代码时候,很有可能两个线程要对同一个变量进行更改。

引用自fangrk和deterly
uoyevoli 2007-08-21
  • 打赏
  • 举报
回复
大家对IInterlockedExchange函数和volatile关键字的作用都说的不错,但是为什么要交换同一个变量自身呢??
冷月清晖 2007-08-20
  • 打赏
  • 举报
回复

volatile如果理解不深,可以看一下:
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如

操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行

优化,从而可以提供对特殊地址的稳定访问。

使用该关键字的例子如下:

int volatile nVint;

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

参考:http://blog.vckbase.com/iwaswzq/archive/2004/12/05/1896.aspx

deterly 2007-08-20
  • 打赏
  • 举报
回复
为什么要交换同一个变量???

========

很简单,在多线程代码时候,很有可能两个线程要对同一个变量进行更改。
deterly 2007-08-20
  • 打赏
  • 举报
回复
用最简单的一句话来概括说就是,该变量在被改变时,不允许同时有其它语句同时执行改变此变量的操作。
iambic 2007-08-20
  • 打赏
  • 举报
回复
提供原子操作吧。
fangrk 2007-08-20
  • 打赏
  • 举报
回复
不知道函数的代码怎么知道函数的意思?上网找找:
InterlockedExchange

VB声明
Declare Function InterlockedExchange Lib "kernel32" Alias "InterlockedExchange" (Target As Long, ByVal Value As Long) As Long
说明
设置一个长整数变量的值
返回值
Long,变量的前一个值
参数表
参数 类型及说明
Target Long,要设置的变量
Value Long,变量的新值
注解
这个函数执行的操作可以安全地避开同步问题——即使是一个共享变量

pripor 2007-08-20
  • 打赏
  • 举报
回复
MSDN中如上声明~~~~
pripor 2007-08-20
  • 打赏
  • 举报
回复
The InterlockedExchange function atomically exchanges a pair of values. The function prevents more than one thread from using the same variable simultaneously.

If you are exchanging pointer values, this function has been superseded by the InterlockedExchangePointer function.

To operate on 64-bit memory locations and values, use the InterlockedExchange64 function.


LONG InterlockedExchange(
LONG volatile* Target,
LONG Value
);

taodm 2007-08-20
  • 打赏
  • 举报
回复
贴出InterlockedExchange的声明。
pripor 2007-08-20
  • 打赏
  • 举报
回复
关键是这个变量已经有临界区保护,也不是全局的变量,属于数据成员
难道是多核的需要,偶是这么猜得
pripor 2007-08-20
  • 打赏
  • 举报
回复
为什么要交换同一个变量???
rsp19801226 2007-08-20
  • 打赏
  • 举报
回复
volatile int nVint;我一般喜欢这么用,那是不是感觉应该和const感觉差不多呢?

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧