读写锁的一个简单实现
2011-03-27 23:00
218 查看
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#define LOCK_READ 0
#define LOCK_WRITE 1
class rwlock{
public:
rwlock();
~rwlock();
public:
void lock(int direct);
void unlock(int direct);
void lock_exclusive(void);
void unlock_exclusive(void);
void wrlock() { lock(LOCK_WRITE); }
void wrunlock() { unlock(LOCK_WRITE); }
void rdlock() { lock(LOCK_READ); }
void rdunlock() { unlock(LOCK_READ); }
private:
volatile LONG count;
volatile LONG direct;
HANDLE finish_event;
CRITICAL_SECTION start_lock;
};
rwlock::rwlock()
{
count = 0;
direct = 0;
finish_event = CreateEvent(NULL, FALSE, FALSE, NULL);
InitializeCriticalSection(&start_lock);
}
rwlock::~rwlock()
{
assert(count == 0);
CloseHandle(finish_event);
DeleteCriticalSection(&start_lock);
}
void rwlock::lock(int _direct)
{
EnterCriticalSection(&start_lock);
while (count > 0 &&
direct != _direct) {
WaitForSingleObject(finish_event, INFINITE);
}
direct = _direct;
InterlockedIncrement(&count);
LeaveCriticalSection(&start_lock);
}
void rwlock::unlock(int _direct)
{
assert(count > 0);
assert(direct == _direct);
InterlockedDecrement(&count);
SetEvent(finish_event);
}
void rwlock::lock_exclusive(void)
{
EnterCriticalSection(&start_lock);
while (count > 0 &&
direct != _direct) {
WaitForSingleObject(finish_event, INFINITE);
}
InterlockedIncrement(&count);
}
void unlock_exclusive(void)
{
InterlockedDecrement(&count);
LeaveCriticalSection(&start_lock);
}
static DWORD CALLBACK ReadFunc(LPVOID lpVoid)
{
rwlock * plock = (rwlock *)lpVoid;
while ( 1 ) {
plock->rdlock();
printf("Start Read: threaid %x\n", GetCurrentThreadId());
printf("Call Read: threaid %x\n", GetCurrentThreadId());
printf("End Read: threaid %x\n", GetCurrentThreadId());
plock->rdunlock();
}
return 0;
}
int main(int argc, char * argv[])
{
DWORD id;
rwlock lock;
for (int i = 0; i < 10; i ++) {
HANDLE handle = CreateThread(NULL, 0, ReadFunc, &lock, 0, &id);
CloseHandle(handle);
}
while ( 1 ) {
lock.wrlock();
printf("Start Write: threaid %x\n", GetCurrentThreadId());
for (int j = 0; j < 10; j++) {
printf("Call Write: threaid %x\n", GetCurrentThreadId());
}
printf("End Write: threaid %x\n", GetCurrentThreadId());
lock.wrunlock();
}
return 0;
}
#include <assert.h>
#include <windows.h>
#define LOCK_READ 0
#define LOCK_WRITE 1
class rwlock{
public:
rwlock();
~rwlock();
public:
void lock(int direct);
void unlock(int direct);
void lock_exclusive(void);
void unlock_exclusive(void);
void wrlock() { lock(LOCK_WRITE); }
void wrunlock() { unlock(LOCK_WRITE); }
void rdlock() { lock(LOCK_READ); }
void rdunlock() { unlock(LOCK_READ); }
private:
volatile LONG count;
volatile LONG direct;
HANDLE finish_event;
CRITICAL_SECTION start_lock;
};
rwlock::rwlock()
{
count = 0;
direct = 0;
finish_event = CreateEvent(NULL, FALSE, FALSE, NULL);
InitializeCriticalSection(&start_lock);
}
rwlock::~rwlock()
{
assert(count == 0);
CloseHandle(finish_event);
DeleteCriticalSection(&start_lock);
}
void rwlock::lock(int _direct)
{
EnterCriticalSection(&start_lock);
while (count > 0 &&
direct != _direct) {
WaitForSingleObject(finish_event, INFINITE);
}
direct = _direct;
InterlockedIncrement(&count);
LeaveCriticalSection(&start_lock);
}
void rwlock::unlock(int _direct)
{
assert(count > 0);
assert(direct == _direct);
InterlockedDecrement(&count);
SetEvent(finish_event);
}
void rwlock::lock_exclusive(void)
{
EnterCriticalSection(&start_lock);
while (count > 0 &&
direct != _direct) {
WaitForSingleObject(finish_event, INFINITE);
}
InterlockedIncrement(&count);
}
void unlock_exclusive(void)
{
InterlockedDecrement(&count);
LeaveCriticalSection(&start_lock);
}
static DWORD CALLBACK ReadFunc(LPVOID lpVoid)
{
rwlock * plock = (rwlock *)lpVoid;
while ( 1 ) {
plock->rdlock();
printf("Start Read: threaid %x\n", GetCurrentThreadId());
printf("Call Read: threaid %x\n", GetCurrentThreadId());
printf("End Read: threaid %x\n", GetCurrentThreadId());
plock->rdunlock();
}
return 0;
}
int main(int argc, char * argv[])
{
DWORD id;
rwlock lock;
for (int i = 0; i < 10; i ++) {
HANDLE handle = CreateThread(NULL, 0, ReadFunc, &lock, 0, &id);
CloseHandle(handle);
}
while ( 1 ) {
lock.wrlock();
printf("Start Write: threaid %x\n", GetCurrentThreadId());
for (int j = 0; j < 10; j++) {
printf("Call Write: threaid %x\n", GetCurrentThreadId());
}
printf("End Write: threaid %x\n", GetCurrentThreadId());
lock.wrunlock();
}
return 0;
}
相关文章推荐
- 利用读写锁简单实现一个缓存demo
- 自己实现一个简单的读写锁
- 一个简单的读写锁的实现(WINDOWS平台)
- Java 一个简单Hashtable的实现
- 【1】实现一个简单的linux系统引导程序
- c++11实现一个简单的lexical_cast
- node.js 一个简单的页面输出实现代码
- JAVA实现一个简单的代数运算语言编译器(四)-- 表达式计算
- 分享:实现了一个简单的嵌入式K/V数据库
- nginx 学习五 filter模块简介和实现一个简单的filter模块
- 用redis来实现Session保存的一个简单Demo
- jquery实现的一个超级简单的下拉菜单
- 如何在ns2中实现一个简单的网络协议
- 利用线性布局和相对布局实现一个简单的页面并且使应用支持国际化语言
- 一个简单smart pointer的实现
- C语言枚举进程,实现一个简单的内存补丁
- 一个简单词法分析器的实现代码
- 如何在ns2中实现一个简单的网络协议
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
- 动手做一个EventBus(二):实现一个简单的EventBus