?? 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 + -