这个函数比较*Addend和Comperand, 如果*Addend大于Comperand, 就给*Addend加上Value, 返回值则是*Addend的初值。
仿照上面的例子,我们还可以写出InterlockedAnd、InterlockedOr和InterlockedXor的实现,这也是我以前经常抱怨的,因为系统只在ddk中提供了它们!但话说回来,这三个函数还有更简单的实现方式,因为汇编指令and、or、xor都支持lock前缀,如果直接用汇编实现的话,会更简单高效!
最后借这篇文字的地盘宣传一下另一篇文字,对一些问题的思考,首页不让发非技术贴,它的人气太低了。
posted on 2005-10-22 12:14 局部变量 阅读(4508) 评论(11) 编辑 收藏
请问一个问题: windows下多线程互斥、同步的几种方式,个种方式的开销,你是怎么认为、看待的?
ah? InterlockedExchangeAdd函数没看过?要这么麻烦? 至于其他的位运算,恐怕没有原子函数。编程高级语言需要考虑通用性,是不可能面面俱到的。可以说,程序员是把复杂的东西简单化,用户的简单是程序员的汗水换来的,想啥都简单,还是别干得了
基本上可以使用互锁函数、临界区和内核对象来完成,互锁函数最快,因为它们一般直接使用cpu指令完成,临界区一般也很快,但在等待时他也要使用内核对象。内核对象最慢,因为会有ring3到ring0的切换,但它可完成进程间的同步互斥,而前两种只限于同一进程中的线程。
见过InterlockedExchangeAdd,它是InterlockedIncrement的增强方式,但不可能只使用它来以原子方式完成"if( n > 100 ) n++;"这样的功能。
互锁指哪个? 我只知道CriticalSection、Semaphore、Event、Mutex等。 自己一般用的是CriticalSection(简单,按照阁下的意见,也快速)。 不过,互锁指哪个?不会是Mutex(我一般是翻译为“互斥量”,一般用于进程间,而且是内核对象,而且速度也不如临界区!)?
不是mutex,mutex属于内核对象 互锁是一组函数(api),它们都以Interlocked开始,在msdn中查一下就知道了,翻译为互锁是我从《windows核心编程》上学来的,应该还算贴切
http://blog.vckbase.com/bastet/archive/2005/03/22/3872.html MUTEX比临界区速度差多了。 http://blog.vckbase.com/bastet/archive/2005/03/22/3870.html
我这人比较懒惰,你搞个全英文的,我就一般不看的。看起来,太痛苦了。本来就是一件很痛苦的事,也大抵痛苦的事很多,再要又看起来痛苦,我就些许逃避了。:}
http://blog.vckbase.com/bruceteen/archive/2005/06/14/6567.html
有个问题想请教, 循环会不会导致CPU负荷急剧上升?
不会,简单分析一下就可以看出来了
Copyright © 局部变量