📄 readwritelock.c
字号:
/*
* Copyright (c) 2000-2008
* Author: Weiming Zhou
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.
*/
#include <windows.h>
#include <stdio.h>
#include "CapiGlobal.h"
typedef struct RWLOCK_st {
LOCK ReadLock; /* 读操作锁,主要用来保护计数器变量的读写 */
LOCK WriteLock; /* 写操作锁 */
UINT uReadCount; /* 正在进行的读操作的数量 */
} RWLOCK;
/** 读写锁的创建函数,负责创建一个读写锁对象
@return RWLOCK * - RWLOCK指针,失败返回NULL
*/
RWLOCK *RWLock_Create(void)
{
RWLOCK *pRWLock;
pRWLock = (RWLOCK *)malloc(sizeof(RWLOCK));
if ( pRWLock != NULL )
{
pRWLock->ReadLock = LockCreate();
if ( pRWLock->ReadLock != NULL )
{
pRWLock->WriteLock = LockCreate();
pRWLock->uReadCount = 0;
}
else
{
free(pRWLock);
pRWLock = NULL;
}
}
return pRWLock;
}
/** 释放一个RWLOCK对象
@param RWLOCK *pRWLock - 读写锁对象指针
@return void - 无
*/
void RWLock_Destroy(RWLOCK *pRWLock)
{
if ( pRWLock != NULL )
{
LockClose(pRWLock->ReadLock);
LockClose(pRWLock->WriteLock);
free(pRWLock);
}
}
/** 读写锁的读操作锁函数,有读操作时需要调用这个函数进行读操作保护
@param RWLOCK *pRWLock - 读写锁对象指针
@return void - 无
*/
void RWLock_LockRead(RWLOCK *pRWLock)
{
Lock(pRWLock->ReadLock);
pRWLock->uReadCount += 1;
if ( pRWLock->uReadCount == 1 )
{
/* 当是第1个读者的时候,需要将写锁锁上防止写操作 */
Lock(pRWLock->WriteLock);
}
Unlock(pRWLock->ReadLock);
}
/** 读写锁的读操作解锁函数,需要和RWLock_LockRead()函数配对使用
@param RWLOCK *pRWLock - 读写锁对象指针
@return void - 无
*/
void RWLock_UnlockRead(RWLOCK *pRWLock)
{
Lock(pRWLock->ReadLock);
pRWLock->uReadCount -= 1;
if ( pRWLock->uReadCount == 0 )
{
/* 当没有读者的时候,需要将些锁释放以便于其他任务可以进行写操作 */
Unlock(pRWLock->WriteLock);
}
Unlock(pRWLock->ReadLock);
}
/** 读写锁的写操作锁函数,写操作发生前需要先调用这个函数进行写操作保护
@param RWLOCK *pRWLock - 读写锁对象指针
@return void - 无
*/
void RWLock_LockWrite(RWLOCK *pRWLock)
{
Lock(pRWLock->WriteLock);
}
/** 读写锁的写操作解锁函数,需要和RWLock_LockWrite()函数配对使用
@param RWLOCK *pRWLock - 读写锁对象指针
@return void - 无
*/
void RWLock_UnlockWrite(RWLOCK *pRWLock)
{
Unlock(pRWLock->WriteLock);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -