zoukankan      html  css  js  c++  java
  • 读写锁的一个简单实现

    #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, &lock0&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;
    }
  • 相关阅读:
    qt鼠标事件总结(坐标,跟踪,点击判断)
    从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
    前端篇: 前端演进史
    找一款防文件或文件夹误删除,移动,修改的软件
    yyyy
    盘点我用过的那些网盘(那些年,我们一起玩的网盘)
    Win8/8.1/10获得完整管理员权限的方法
    [置顶] IT老男人读《因为痛,所以叫青春》
    dddd
    用JUNCTION映射文件夹内容 解决多系统跑同一个虚拟机而共享文件夹路径不同的问题
  • 原文地址:https://www.cnblogs.com/ahuo/p/1997271.html
Copyright © 2011-2022 走看看