2015-01-26 3 views
3

다른 스레드에서 액세스 (읽기 및 쓰기)해야하는 std::map<int, object*>이 있습니다. 물론, 하나의 중요 섹션을 읽기 및 쓰기 모두에 사용할 수는 있지만, 많은 수의 쓰기 (보통 초당 수천 개)와 많은 수의 쓰기 (보통 하나의 삽입 및 삭제)가 있기 때문에 성능에 큰 영향을 미칩니다. 하나는 쓰레드를 생성하고 파괴하는 동안 지움).std :: map의 thread-safe 사용

따라서 쓰기를 위해 CriticalSection을 사용해야하고 다른 스레드가 읽기 전에 쓰기 작업을하고 있는지 확인해야합니다. 그러나 어떻게? C++ 11 및 부스트에 대한 솔루션을 찾았지만 호환성 문제로 인해 Visual Studio 2008을 사용하고 있습니다.

누군가가 나에게 그것을 수행하는 방법에 대한 예나 설명을 줄 수 있습니까? 감사!

+4

Vista 용 Windows API에는 리더/라이터 잠금 장치가 있습니다. https://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx –

답변

0

std :: map을 래핑하는 클래스를 만들고 뮤텍스로 쓰기/읽기 함수를 잠글 수 있습니다. 뮤텍스 구조를이 클래스의 멤버로 사용하고 함수 당 적절하게 잠 그거나 잠금을 해제하십시오.

Windows API에는 시스템에 뮤텍스 핸들을 등록하기 위해 일부 mutex functions이 있습니다. 이 핸들은 Windows가 뮤텍스를 인식하고 대기 중인지 확인하는 방법으로 사용됩니다.

다음은 간단한 Windows API 호출을 사용하기위한 뮤텍스 클래스입니다.

class MyMutex { 

    private: 
     HANDLE m_hMutex; 

    public: 
     MyMutex() 
     { 
      m_hMutex = CreateMutex(NULL, FALSE, NULL); 
     } 

     ~MyMutex() 
     { 
      CloseHandle(m_hMutex); 
     } 

     void Lock() 
     { 
      BOOL test = WaitForSingleObject(m_hMutex, INFINITE); 
     } 

     void UnLock() 
     { 
      ReleaseMutex(m_hMutex); 
     } 
}; 
0

당신이 찾고있는 것은 다중 판독기/단일 기록기 잠금 시스템입니다. 불행하게도 C++ 14 이전에는이 ​​유형의 내장 유형이 없습니다. 부스트를 사용할 수 있다면 부스트를 가지고 갈 수 있습니다. shared_mutex

그렇지 않으면 스스로해야합니다 (other thread을 SO로 읽음). 그의 의견에 T.C.에 명시된대로 MS SRW 잠금을 사용할 수도 있습니다 (there 참조).

클래스 shared_mutex이 잘 정의되어 있고 사용 가능하다고 가정 해 보겠습니다. 보호하려는 클래스에 하나의 속성으로 하나의 shared_mutex 객체를 추가하기 만하면됩니다. 나는이 같은 클래스에서 완전히 잠금이없는 방법을 유지하고 주위에 래퍼를 추가 할 권합니다 : 이렇게

class Whatever; 
class MyClass { 
    boost::shared_mutex mutex; 
    Whatever find_unlocked() { 
     whatever blob_blob; 
     blob_blob = do_whatever_work_find_does(); 
     return blob_blob; 
    } 
    void write_smth_unlocked() { 
     do_something_that_needs_writing_to_MyClass(); 
    } 
public: 
    Whatever find() { 
     Whatever blob; 
     mutex.lock_shared(); // Locks for reading (shared ownership on the mutex) 
     blob = find_unlocked(); 
     mutex.unlock_shared(); 
     return blob; 
    } 
    void write_smth() { 
     mutex.lock(); // Locks for writing (exclusive ownership on the mutex) 
     write_smth_unlocked(); 
     mutex.unlock(); 
    } 
}; 

당신에게 클래스 동안 당신이 새로운 기능에 정의하는 작업을 재사용 할 수있는 능력을 부여합니다 잠금 시스템을 통해 여전히 새로운 작업을 모두 보호 할 수 있습니다.

  • 개인 (또는 보호) 방법 : operation_unlocked()
  • 공개 일 : operation()shared_mutex 사용 결국

    당신은 당신이 정의하는 모든 작업에 대한 두 가지 방법이있을 것입니다.
관련 문제