局部变量的作用域

导航

<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

公告

我的邮件:

留言簿(7)

随笔分类

随笔档案

文章档案

我的链接

搜索

最新评论

阅读排行榜

评论排行榜

一个轻量级的单写多读锁

    与《windows核心编程》上的那个相比最大的优势是体积小, 它只有四个字节(《windows核心编程》上的那个至少是它的10倍), 如果你有大量对象需要进行单写多读访问的话, 它会比较适用. 缺点是它在加锁时使用的等待函数是Sleep, 如果访问冲突很多的话, 效率比较低. 代码如下(很简单, 就不多做解释了):
 

// 头文件

#ifndef SWMR_LOCK_H
#define SWMR_LOCK_H

#ifndef SWMR_LOCK_NUMBER_OF_WRITER
#define SWMR_LOCK_NUMBER_OF_WRITER        1
#endif // SWMR_LOCK_NUMBER_OF_WRITER

typedef volatile long SWMR_LOCK

void SwmrLockInitialize( SWMR_LOCK* pLock );
void SwmrLockWriteLock( SWMR_LOCK* pLock );
void SwmrLockWriteUnlock( SWMR_LOCK* pLock );
void SwmrLockReadLock( SWMR_LOCK* pLock );
void SwmrLockReadUnlock( SWMR_LOCK* pLock );
void SwmrLockUninitialize( SWMR_LOCK* pLock );

#endif

--------------------------------------------------------------------------------

// 实现文件
#include "srmrl.h"

////////////////////////////////////////////////////////////////////////////////

#define WRITING_FLAG    0x40000000

////////////////////////////////////////////////////////////////////////////////

void SwmrLockInitialize( SWMR_LOCK* pLock )
{
    *pLock = 0;
}

////////////////////////////////////////////////////////////////////////////////

void SwmrLockWriteLock( SWMR_LOCK* pLock )
{
    long old, xchg;
    do {
        old = *pLock;
#if( SWMR_LOCK_NUMBER_OF_WRITER > 1 )
        if( old & WRITING_FLAG )
        {
            Sleep( 0 );
            continue;
        }
#endif // ( SWMR_LOCK_NUMBER_OF_WRITER > 1 )
        xchg = old | WRITING_FLAG;
    } while( _InterlockedCompareExchange( pLock, xchg, old ) != old );

    // wait until all readers quit reading
    while( old != WRITING_FLAG )
    {
        Sleep( 0 );
        old = *pLock;
    }
}

////////////////////////////////////////////////////////////////////////////////

void SwmrLockWriteUnlock( SWMR_LOCK* pLock )
{
    *pLock = 0;
}

////////////////////////////////////////////////////////////////////////////////

void SwmrLockReadLock( SWMR_LOCK* pLock )
{
    long old, xchg;
    do {
        old = *pLock;
        if( old & WRITING_FLAG )
        {
            Sleep( 0 );
            continue;
        }
        xchg = old + 1;
    } while( _InterlockedCompareExchange( pLock, xchg, old ) != old );
}

////////////////////////////////////////////////////////////////////////////////

void SwmrLockReadUnlock( SWMR_LOCK* pLock )
{
    _InterlockedDecrement( pLock );
}

////////////////////////////////////////////////////////////////////////////////

void SwmrLockUninitialize( SWMR_LOCK* pLock )
{
    pLock; // has nothing to do

}

posted on 2007-01-23 20:41 局部变量 阅读(1944) 评论(5)  编辑 收藏

评论

# re: 一个轻量级的单写多读锁 2007-01-23 21:40 boli

单写多读 是指在写的时候只能一个写,其他的不能读也不能写。不写的时候大家都可以读(不用同步)? 

# to boli: yes 2007-01-24 08:30 局部变量

rt

# re: 一个轻量级的单写多读锁 2007-01-24 09:43 清风雨

仔细看代码的习惯比较差,一般都静不下心。
粗看下来在读的时候,有个线程跑去写了,会不会有问题?

关于多线程锁机制,我记得有篇文章,具体记不住了,好像是在blog.csdn.net/pongba上吧。

另外有个疑问,为什么都习惯用SWMR_LOCK*,而不是用SWMR_LOCK &呢?

# 文中的do while循环有bug 2008-01-09 13:11 局部变量

文中的do while循环有bug,请大家使用时注意,参见
http://blog.vckbase.com/localvar/archive/2008/01/08/31689.html

# re: 一个轻量级的单写多读锁 2009-12-08 16:55 情趣

仔细阅读下

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