局部变量的作用域

导航

<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

公告

我的邮件:

留言簿(7)

随笔分类

随笔档案

文章档案

我的链接

搜索

最新评论

阅读排行榜

评论排行榜

对windows互锁函数的补充

    互锁函数是多线程处理中最简单高效的手段之一,但这些函数的功能实在是太差劲了,要求稍微复杂一点,就完成不了。比如“if( n > 100 ) n++;”这么简单的功能,它们就做不到。以前,为了达到互斥的目的,我都要使用一个临界区,现在想想,这个方法简直太笨了!因为借助InterlockedCompareExchange,甚至更复杂的功能都可以轻松实现,而这个函数曾经是我认为的最没用的互锁函数。例如前面的大于某值才加1的功能就可以通过下面这个函数以原子的形式完成:
LONG InterlockedBiggerExchangeAdd( LONG volatile* Addend, LONG Value, LONG Comperand ) throw()
{
    LONG lOrigin;
    
do lOrigin = *Addend;
    
while( (lOrigin > Comperand) &&
        (::InterlockedCompareExchange(Addend, lOrigin 
+ Value, lOrigin) != lOrigin) );
    
return lOrigin;
}

这个函数比较*Addend和Comperand, 如果*Addend大于Comperand, 就给*Addend加上Value, 返回值则是*Addend的初值。

    仿照上面的例子,我们还可以写出InterlockedAnd、InterlockedOr和InterlockedXor的实现,这也是我以前经常抱怨的,因为系统只在ddk中提供了它们!但话说回来,这三个函数还有更简单的实现方式,因为汇编指令and、or、xor都支持lock前缀,如果直接用汇编实现的话,会更简单高效!


    最后借这篇文字的地盘宣传一下另一篇文字,对一些问题的思考,首页不让发非技术贴,它的人气太低了。

posted on 2005-10-22 12:14 局部变量 阅读(4508) 评论(11)  编辑 收藏

评论

# re: 局部变量 2005-10-22 20:20 清风雨

请问一个问题:
windows下多线程互斥、同步的几种方式,个种方式的开销,你是怎么认为、看待的?

# re: 对windows互锁函数的补充 2005-10-22 20:35 arong

ah? InterlockedExchangeAdd函数没看过?要这么麻烦?
至于其他的位运算,恐怕没有原子函数。编程高级语言需要考虑通用性,是不可能面面俱到的。可以说,程序员是把复杂的东西简单化,用户的简单是程序员的汗水换来的,想啥都简单,还是别干得了

# to 清风雨 2005-10-22 22:39 局部变量

基本上可以使用互锁函数、临界区和内核对象来完成,互锁函数最快,因为它们一般直接使用cpu指令完成,临界区一般也很快,但在等待时他也要使用内核对象。内核对象最慢,因为会有ring3到ring0的切换,但它可完成进程间的同步互斥,而前两种只限于同一进程中的线程。

# to arong 2005-10-22 22:42 局部变量

见过InterlockedExchangeAdd,它是InterlockedIncrement的增强方式,但不可能只使用它来以原子方式完成"if( n > 100 ) n++;"这样的功能。

# re: 局部变量 2005-10-23 10:47 清风雨

互锁指哪个?
我只知道CriticalSection、Semaphore、Event、Mutex等。
自己一般用的是CriticalSection(简单,按照阁下的意见,也快速)。
不过,互锁指哪个?不会是Mutex(我一般是翻译为“互斥量”,一般用于进程间,而且是内核对象,而且速度也不如临界区!)?

# re 清风雨 2005-10-23 14:25 局部变量

不是mutex,mutex属于内核对象
互锁是一组函数(api),它们都以Interlocked开始,在msdn中查一下就知道了,翻译为互锁是我从《windows核心编程》上学来的,应该还算贴切

# 这个系列的原代码在LEAK WIN2K里面是有的。我在下面曾经贴出来过的。 2005-10-23 14:54 Diviner

http://blog.vckbase.com/bastet/archive/2005/03/22/3872.html

MUTEX比临界区速度差多了。
http://blog.vckbase.com/bastet/archive/2005/03/22/3870.html

# re: Diviner 2005-10-23 19:03 清风雨

我这人比较懒惰,你搞个全英文的,我就一般不看的。看起来,太痛苦了。本来就是一件很痛苦的事,也大抵痛苦的事很多,再要又看起来痛苦,我就些许逃避了。:}

# 贴广告啦 ^_^ 2005-10-24 09:17 周星星

http://blog.vckbase.com/bruceteen/archive/2005/06/14/6567.html

# re: 对windows互锁函数的补充 2006-01-26 11:55 zhc

有个问题想请教, 循环会不会导致CPU负荷急剧上升?

# re: 对windows互锁函数的补充 2006-01-26 22:23 局部变量

不会,简单分析一下就可以看出来了

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]