2009-06-07 3 views
0

멀티 스레딩 및 잠금에 대한 많은 종류의 인터페이스를 보았습니다.이 인터페이스를 조작하는 방법은 무엇입니까?

다른 사람들이 대기 기능을 구현할 수 있습니다) 하나 개의 클래스와 취득을 (있는 동안

그들 중 일부는 아래의 예제와 같은 2 개 개의 다른 클래스를 포함, 나를 좌절 느낌.

내 질문은 : 왜 우리는 객체 지향 프로그래밍에서 이와 같은 잠금을 설계합니까?

이러한 개체를 조작하는 방법은 무엇입니까?

class Lock 
{ 
public: 
    Lock(); 
    ~Lock(); 

    // Acquire the lock. 
    void 
    acquire() 
    { this->lock_->acquire(); } 

    // Release the lock. 
    void 
    release() 
    { this->lock_->release(); } 

    private: 
    // This class can not be copied. 
    Lock(const Lock&); 
    Lock& operator=(const Lock&); 

    friend class Condvar; 
    Lock_impl* 
    get_impl() const 
    { return this->lock_; } 

    Lock_impl* lock_; 
}; 

class Condvar 
{ 
public: 
    Condvar(Lock& lock); 
    ~Condvar(); 
    // Wait for the condition variable to be signalled. This should 
    // only be called when the lock is held. 
    void 
    wait() 
    { this->condvar_->wait(this->lock_.get_impl()); } 

    // Signal the condition variable--wake up at least one thread 
    // waiting on the condition variable. This should only be called 
    // when the lock is held. 
    void 
    signal() 
    { this->condvar_->signal(); } 

    // Broadcast the condition variable--wake up all threads waiting on 
    // the condition variable. This should only be called when the lock 
    // is held. 
    void 
    broadcast() 
    { this->condvar_->broadcast(); } 

    private: 
    // This class can not be copied. 
    Condvar(const Condvar&); 
    Condvar& operator=(const Condvar&); 

    Lock& lock_; 
    Condvar_impl* condvar_; 
}; 

답변

1

위의 내용은 잠금 및 조건 변수입니다.
다음은 두 가지 고유 한 개념입니다.

잠금은 하나의 원자 잠금 만 켜거나 끕니다.

조건 변수 (올바르게 사용하는 것이 훨씬 더 어렵습니다)가 올바르게 구현 되려면 잠금이 필요하지만 상태 (기본적으로는 개수)는 유지됩니다.

"는 조건 변수"에 대한 자세한 내용은 다음을 참조하십시오
http://en.wikipedia.org/wiki/Monitor_(synchronization)

는 기본적으로 조건 변수는 "모니터"(일명 모니터 영역)을 생성하는 데 사용되는 낮은 수준의 기본 요소이다. 모니터는 여러 스레드에서 사용하도록 설계된 코드 영역이지만 (일반적으로 제어되는 숫자 (단순한 경우)), 여전히 다중 스레드 안전성을 유지합니다.

다음은 '조건 변수'를 사용하는 좋은 예입니다.
How to implement blocking read using POSIX threads

기본적으로 모니터 영역에는 2 개의 스레드가 허용됩니다. 스레드가 벡터에서 읽는 동안 두 번째 스레드가 벡터에서 빠져 나오고 있습니다. '모니터'는 2 개의 스레드 간의 상호 작용을 제어합니다. 잠금을 사용하면 동일한 효과를 얻을 수 있지만 제대로 수행하는 것이 훨씬/많이/훨씬 어렵습니다.

1

잠금의 목적은 두 개의 다른 처리 스레드가 동시에 동일한 메모리 위치를 수정하는 것을 방지하기위한 것입니다.

스레드가 코드 영역을 잠그고 두 번째 스레드가 동일한 코드 영역에 들어가면 두 번째 스레드는 코드를 실행하기 전에 첫 번째 스레드가 잠금을 해제 할 때까지 대기합니다.

관련 문제