xyjzsh

读写锁的实现

 

#include"stdafx.h"
#include
<windows.h>
/*对于一块临界区
**可以同时读
**当要写时,等待所有的读者离开,后来的读者不允许进入
**因为在同一个进程中
**所以使用临界区,而不是使用互斥对象,因为这样比较节省资源
*/

class __declspec(novtable) auto_RWLock
{
public:
    auto_RWLock(
void);
    
~auto_RWLock(void);

    
void LockForRead(void);
    
void UnLockForRead(void);

    
void LockForWrite(void);
    
void UnLockForWrite(void);

private:
    
long readerCount;
    CRITICAL_SECTION critical_section;
    CRITICAL_SECTION reader_all_leave;
}
;
#include"stdafx.h"
#include
"auto_RWLock.h"

auto_RWLock::auto_RWLock(
void):readerCount(0)
{
    InitializeCriticalSection(
&critical_section);
    InitializeCriticalSection(
&reader_all_leave);
}

auto_RWLock::
~auto_RWLock(void)
{
    DeleteCriticalSection(
&critical_section);
    DeleteCriticalSection(
&reader_all_leave);
}


void auto_RWLock::LockForRead(void)
{
    EnterCriticalSection(
&critical_section);
    
    
if(InterlockedIncrement(&readerCount) ==1)
        EnterCriticalSection(
&reader_all_leave);

    LeaveCriticalSection(
&critical_section);
}


void auto_RWLock::UnLockForRead(void)
{
    
if(InterlockedDecrement(&readerCount)==0)
        LeaveCriticalSection(
&reader_all_leave);
}


void auto_RWLock::LockForWrite(void)
{
    EnterCriticalSection(
&critical_section);
    EnterCriticalSection(
&reader_all_leave);
}


void auto_RWLock::UnLockForWrite(void)
{
    LeaveCriticalSection(
&critical_section);
    LeaveCriticalSection(
&reader_all_leave);
}

posted on 2010-12-07 11:33 呆人 阅读(1856) 评论(2)  编辑 收藏 引用 所属分类: 多线程

评论

# re: 读写锁的实现[未登录] 2010-12-27 12:52 joy

写操可能会饿死   回复  更多评论   

# re: 读写锁的实现 2010-12-29 10:58 呆人

@joy
你好,谢谢你,(*^__^*) 嘻嘻……,我看了一下代码写操作确实有饿死的可能,然后我重新修改了一下代码,有空你看看哈。(*^__^*) 嘻嘻……还请多赐教哦~~  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2011年5月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜