크로스 플랫폼 경량급 읽 기와 쓰기 자물쇠

잠 긴 데이터 구 조 는 충분히 간단 합 니 다. volatile long;
롱 의 최고 위 치 를 자물쇠 표 지 를 저장 하고 24 위 를 읽 기 자물쇠 계수 로 낮 춥 니 다.
자물쇠 쓰기 의 실현:
1. 잠 금 을 추가 할 때 롱 비트 0 을 기다 릴 때 잠 금 표 지 를 설정 하고 원자 조작 으로 이 루어 집 니 다.자 물 쇠 를 추가 하기 전에 아무 도 자 물 쇠 를 읽 거나 자 물 쇠 를 쓰 지 않 을 것 을 보증 할 수 있 습 니 다.
2. 잠 금 을 풀 때 잠 금 표 지 를 지우 기;
읽 기 자물쇠 의 실현:
1. 자 물 쇠 를 추가 할 때 먼저 읽 기 자 물 쇠 를 늘 려 놓 기 전에 모든 자 물 쇠 를 사용 하 는 데 실패 합 니 다.그리고 자물쇠 가 풀 릴 때 까지 기다 리 기;
2. 잠 금 해제 시 읽 기 잠 금 계수 감소;
 
약속
1. 자 물 쇠 를 채 웠 습 니 다 (읽 기 자물쇠 가 없습니다)
2. 또는 여러 개의 읽 기 자 물 쇠 를 동시에 추가 합 니 다 (자물쇠 가 없습니다)
 
헤더 파일;
#ifndef _MY_ATOMIC_H_
#define _MY_ATOMIC_H_


class ReadLock
{
public:
    ReadLock(volatile long  & lock);
    ~ReadLock();
private:
    ReadLock(const ReadLock & );
    ReadLock & operator = (const ReadLock & );
private:
    volatile long & m_lock;
};

class WriteLock
{
public:
    WriteLock(volatile long  & lock);
    ~WriteLock();
private:
    WriteLock(const WriteLock & );
    WriteLock & operator = (const WriteLock & );
private:
    volatile long & m_lock;
};

#endif

헤더 파일;
#include "Atomic.h"

static union{ char c[4];unsigned long myLong;} test_union = { { 'L','?','?','B'} };
#define ENDIANNESS  ((char)test_union.myLong)


void MyLockedAdd(volatile long & dst,long val)
{
#ifdef WIN32
    InterlockedExchangeAdd(&dst,val);
#else
    __sync_add_and_fetch(&dst,val);
#endif
}

bool MyLockedCompareSwap(volatile long & dst,long val,long cmp)
{
#ifdef WIN32
    return cmp == InterlockedCompareExchange(&dst,val,cmp);
#else
    return __sync_bool_compare_and_swap (&dst,cmp,val);
#endif

}

const long WRITE_LOCK_VALUE = 1<<24; 
ReadLock::ReadLock(volatile long & lock):m_lock(lock)
{
    MyLockedAdd(m_lock,1);

    volatile char * pWL = (volatile char *)&m_lock;
    if(ENDIANNESS == 'L')
        pWL += 3;
    for(;*pWL;)
        ;
}

ReadLock::~ReadLock()
{
    MyLockedAdd(m_lock,-1);
}

WriteLock::WriteLock(volatile long & lock):m_lock(lock)
{
    while(!MyLockedCompareSwap(m_lock,WRITE_LOCK_VALUE,0))
        ;
}

WriteLock::~WriteLock()
{
    MyLockedAdd(m_lock,-WRITE_LOCK_VALUE);
}

 
다음으로 전송:https://www.cnblogs.com/wanliyun/p/4664904.html

좋은 웹페이지 즐겨찾기