2011-11-02 3 views
10

부스트 또는 최신 std :: thread 라이브러리를 사용할 수 없습니다. 갈 방법은 범위가 지정된 뮤텍스의 맞춤 구현을 만드는 것입니다.범위가 지정된 뮤텍스 잠금에 대한 사용자 정의 RAII C++ 구현

몇 가지 단어로 클래스 인스턴스가 생성되면 뮤텍스가 잠 깁니다. 클래스 파괴시 뮤텍스는 잠금 해제됩니다.

구현이 가능합니까? 나는 바퀴를 다시 발명하고 싶지 않습니다.

나는 pthreads를 사용해야합니다.

  • 자원 획득이 오래된 대답

답변

13

초기화 == "RAII"입니다.

  • std::lock_guard
  • std::mutex

    그리고 표준 : unique_lock 같은 다른 옵션이 부스트 : unique_lock

    : C++ (11)는 독립적 인 더 플랫폼을하다 더 나은 헬퍼를 포함
  • 모든 RAII 자습서가 수행합니다.

    여기에 요점이다 : (또한 http://ideone.com/kkB86에) 당신이 mutex_t 대한이 일반적인 할 수 물론

    // stub mutex_t: implement this for your operating system 
    struct mutex_t 
    { 
        void Acquire() {} 
        void Release() {} 
    }; 
    
    struct LockGuard 
    { 
        LockGuard(mutex_t& mutex) : _ref(mutex) 
        { 
         _ref.Acquire(); // TODO operating system specific 
        }; 
    
        ~LockGuard() 
        { 
          _ref.Release(); // TODO operating system specific 
        } 
        private: 
        LockGuard(const LockGuard&); // or use c++0x ` = delete` 
    
        mutex_t& _ref; 
    }; 
    
    int main() 
    { 
        mutex_t mtx; 
    
        { 
         LockGuard lock(mtx); 
         // LockGuard copy(lock); // ERROR: constructor private 
         // lock = LockGuard(mtx);// ERROR: no default assignment operator 
        } 
    
    } 
    

    , 당신은 서브 클래 싱을 방지 할 수있다./할당 복사가 이미 있기 때문에 pthreads의 내용은 참조 필드

    편집 금지 :

    struct mutex_t 
    { 
        public: 
         mutex_t(pthread_mutex_t &lock) : m_mutex(lock) {} 
    
         void Acquire() { pthread_mutex_lock(&m_mutex); } 
         void Release() { pthread_mutex_unlock(&m_mutex); } 
        private: 
         pthread_mutex_t& m_mutex; 
    }; 
    
    +0

    나는의 pthreads를 요청하는 내 질문에 업데이트되었습니다. 그러므로 _ref.acquire()는 pthread_mutex_lock (_ref)이 될 것입니까? – cateof

    +1

    음. 스레딩 라이브러리에 구현할 부분이 그런 것으로 표시되었습니다. 어쨌든, 나는 pthread_mutex_t에 대한 빠른 구현을 참조 용으로 추가했다. – sehe

    +0

    OS 세부 사항을 지정하기도 전에 답을 얻었습니다 :-) – cateof