2011-09-08 4 views
0

나는 memroy에 정보를 저장하기 위해 dll을 쓰기 위해 많은 스레드가 동시에 데이터를 방문하기를 원하기 때문에 읽기/쓰기 잠금을 사용하여 동기화 할 수 있습니다. 그리고 나는 사용자에게 어떤 기능을 수출, 함수에서, 나는 자물쇠를 누른 다음 데이터를 얻고 을 종료하고 잠금을 해제합니다. 예를 들어,이 함수와 같습니다.두 수준의 잠금을 구현

void GetData(data) 
{ 
    //require lock 

    //get data 

    //release lock 
} 

내 사용자

동시에
void ProcessData() 
{ 
    // do something 1 

    GetData(data1); 

    // do something 2 

    GetData(data2); 

    ... 
} 

, 다른 스레드가 내 DLL의 호출 다른 내보내기 기능에 의해 내 DLL의 데이터를 변경할 수 있습니다, 예를 들어,이 기능에 GetData의 여러 번 호출 할 수 있습니다 , 데이터는 GetData (데이터); 및 GetData (data2); 하지만 내 사용자는 내 데이터가 ProcessData에서 절대로 변경되지 않기를 원하기 때문에 data1은이 상황에서 data2와 관련 될 수 있습니다. 그리고 난 내 DLL에 내 자물쇠를 폭로하고 싶지 않아. Thx와 같은 것을 구현할 방법이 있습니까?

+1

적절한 언어로 질문에 태그를 답니다. –

+0

당신이해야 할 일을 파악한 것처럼 보이기 때문에 올바른 라이브러리 인터페이스를 숙지해야합니다. 가장 좋은 대답은 플랫폼에 따라 다를 수 있습니다. 'pthread_rwlock_init' 또는'InitializeSRWLock'을 몇 가지 가능한 예제로 검색하십시오. Boost 또는 C++ 11도 도움이 될 수 있습니다. 그들이 제공하는 것을 확신하지 못합니다. 또한, 필요에 따라 rwlock이 아닌 간단한 뮤텍스를 고려할 수도 있습니다. – asveikau

+0

확실하게 잠그는 유일한 클라이언트는 * 클라이언트 * 코드라는 것을 알았습니다. 일반적으로 문제가되지 않는 경우가 대부분입니다. –

답변

0

ProcessData가 실행되는 동안 사람들이 데이터를 쓸 수있게 하시겠습니까? 또는 작성하는 사람들은 ProcessData가 완료 될 때까지 차단되어야합니까?

그렇다면 ProcessData가 모든 작성자를 잠글 수있게 해주는 2 개의 함수를 내보낼 수 있습니다.

LockOutWriters() { // lock } 
WriteData() { // blocks if above is locked } 
UnLockWriters() { // unlock } 

아니, 다음()를 호출 시간 GetData의에서 데이터의 스냅 샷을하고 ProcessData가 GetData의를 호출 할 때마다, 그것은 해당 스냅 샷에서 데이터를 가져옵니다 있는지 확인해야합니다.

관련 문제