Windows 平台之读写锁

//windows平台下使用临界段实现的读写锁功能,代码短小简洁。导出函数名使用POSIX函数名

///By Fanxiushu 2012

#pragma once

#ifdef WIN32

#include <stdio.h>
#include <assert.h>
#include <windows.h>
/读写锁
struct rwlock
{
private:
    CRITICAL_SECTION write_lock;
    CRITICAL_SECTION read_lock;
    volatile LONG     reader_count;
    volatile bool        is_enter_writer;
public:
    rwlock(){
        reader_count = 0;
        is_enter_writer = false;
        ::InitializeCriticalSection( &write_lock);
        ::InitializeCriticalSection(&read_lock);
    }
    ~rwlock(){
        ::DeleteCriticalSection(&write_lock);
        ::DeleteCriticalSection(&read_lock);
    }

public:
    int rdlock(){
        EnterCriticalSection( &write_lock );
        if( ::InterlockedIncrement( &reader_count ) == 1 ){
            EnterCriticalSection( &read_lock );
        }
        LeaveCriticalSection( &write_lock );

        return 0;
    }
    int wrlock(){
        EnterCriticalSection( &write_lock );
        EnterCriticalSection( &read_lock);
        is_enter_writer = true;
        return 0;
    }
    void _unlock() {
        if( is_enter_writer ){
            is_enter_writer = false;
            LeaveCriticalSection( &read_lock );
            LeaveCriticalSection( &write_lock );
        }
        else{
            if( ::InterlockedDecrement( &reader_count) == 0 ){
                LeaveCriticalSection( &read_lock );
            }
        }
    }
   ///
};

typedef rwlock  pthread_rwlock_t;

#define  pthread_rwlock_init( l )
#define  pthread_rwlock_destroy(l)
#define  pthread_rwlock_rdlock( l )            ((rwlock*)(l))->rdlock()
#define  pthread_rwlock_wrlock( l )           ((rwlock*)(l))->wrlock()
#define  pthread_rwlock_unlock( l )           ((rwlock*)(l))->_unlock()

#else
#include <unistd.h>
#include <pthread.h>
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨中风华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值