看msdn的InterlockedDecrement没看明白干吗的?哪位通俗一些的说明一下(立刻给分) 看msdn的InterlockedDecrement没看明白干吗的?哪位通俗一些的说明一下(立刻给分) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我以为早就有人回答了。首先要理解多线程同步,共享资源(同时访问全局变量的问题),否则就难以理解。result = InterlockedDecrement(&SomeInt)如果不考虑多线程其实就是 result = SomeInt - 1;但是考虑到多线程问题就复杂了一些。就是说如果想要得到我预期的结果并不容易。result = SomeInt - 1;举例说:SomeInt如果==1;预期的结果result当然==0;但是,如果SomeInt是一个全程共享的全局变量情况就不一样了。C语言的"result = SomeInt - 1;"在实际的执行过程中,有好几条指令,在指令执行过程中,其它线程可能改变SomeInt值,使真正的结果与你预期的不一致。所以InterlockedDecrement(&SomeInt)的执行过程是这样的{ __禁止其他线程访问 (&SomeInt) 这个地址 SomeInt --; move EAX, someInt; // 设定返回值,C++函数的返回值 都放在EAX中, __开放其他线程访问 (&SomeInt) 这个地址}但是实际上只需要几条指令加前缀就可以完成,以上说明是放大的。你也许会说,这有必要吗? 一般来说,发生错误的概率不大,但是防范总是必要的。 如果不考虑多线程result = InterlockedDecrement(&SomeInt);就是result = SomeInt - 1;如果SomeInt==1,result一定==0;但是,在多线程中如果SomeInt是线程间共享的全局变量,情况就不那么简单了。result = SomeInt - 1;在CPU中,要执行好几条指令。在指令中间有可能SomeInt被线程修改。那实际的结果就不是你预期的结果了。InterlockedDecrement(&SomeInt)放大的过程,如下:{ __禁止其他线程访问 &SomeInt 地址; SomeInt --; /////其他线程不会在这里修改SomeInt值。 !!!!!! mov EAX, SomeInt; //C++ 函数返回值 总放在EAX中。 __开放其他线程访问 &SomeInt 地址;}实际的CPU执行过程只有几条加前缀的指令(586指令)你会说,有必要吗? 出错的概率不大,但是错误总是需要防范的。当然可以用其他多线程机制实现,但是都没有这样简洁,所以Interlocked...函数有必要提供。 勘误: "在CPU中,要执行好几条指令。在指令中间有可能SomeInt被****其他****线程修改。" 多念点儿英语吧!MSDN,金山词霸,祝一路顺风!!!!! 感谢:qindq(蜕叟) 麻烦到http://www.csdn.net/expert/topic/795/795869.xml?temp=.8032801随便跟个贴,我送你100分,我正好要结帐,再次感谢大家的帮忙!msdn在这个函数上的说明真的很少。 求用vc编写的点对点图像传输程序,要求有对话框的,谢谢,高手请进. 可以这样写吗?if(WM_WTSSESSION_CHANGE) exit(1); 比较模糊的几个基础概念,请大家帮助看看,我的理解对吗 请问如何设置SendRequest的超时啊?在DLL里响应不到啊?(急) VC中如何使用ADO连接池 静态加载dll的问题 WTL中如何得到主框架指针? 谁有使用CObList的例子。 如何实现一个可以根据用户选项显示不同对话框的向导? 如何在线程中调用0ndraw实现屏幕的重绘 如何获得本机的ip地址 在DLL中如何共享数据?
SomeInt如果==1;
预期的结果result当然==0;但是,如果SomeInt是一个全程共享的全局变量情况就不一样了。
C语言的"result = SomeInt - 1;"
在实际的执行过程中,有好几条指令,在指令执行过程中,其它线程可能改变SomeInt值,使真正的结果与你预期的不一致。所以InterlockedDecrement(&SomeInt)的执行过程是这样的
{
__禁止其他线程访问 (&SomeInt) 这个地址 SomeInt --;
move EAX, someInt; // 设定返回值,C++函数的返回值 都放在EAX中, __开放其他线程访问 (&SomeInt) 这个地址
}但是实际上只需要几条指令加前缀就可以完成,以上说明是放大的。你也许会说,这有必要吗? 一般来说,发生错误的概率不大,但是防范总是必要的。
result = InterlockedDecrement(&SomeInt);
就是result = SomeInt - 1;
如果SomeInt==1,result一定==0;但是,在多线程中如果SomeInt是线程间共享的全局变量,情况就不那么简单了。
result = SomeInt - 1;
在CPU中,要执行好几条指令。在指令中间有可能SomeInt被线程修改。那实际的结果就不是你预期的结果了。InterlockedDecrement(&SomeInt)
放大的过程,如下:
{
__禁止其他线程访问 &SomeInt 地址; SomeInt --;
/////其他线程不会在这里修改SomeInt值。 !!!!!! mov EAX, SomeInt; //C++ 函数返回值 总放在EAX中。
__开放其他线程访问 &SomeInt 地址;
}实际的CPU执行过程只有几条加前缀的指令(586指令)你会说,有必要吗? 出错的概率不大,但是错误总是需要防范的。当然可以用其他多线程机制实现,但是都没有这样简洁,所以Interlocked...函数有必要提供。
勘误: "在CPU中,要执行好几条指令。在指令中间有可能SomeInt被****其他****线程修改。"
MSDN,金山词霸,祝一路顺风!!!!!
随便跟个贴,我送你100分,我正好要结帐,
再次感谢大家的帮忙!msdn在这个函数上的说明真的很少。