크로스 플랫폼 경량급 읽 기와 쓰기 자물쇠
6979 단어 데이터 구조 와 알고리즘
롱 의 최고 위 치 를 자물쇠 표 지 를 저장 하고 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.