주 초기화 == "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;
};
나는의 pthreads를 요청하는 내 질문에 업데이트되었습니다. 그러므로 _ref.acquire()는 pthread_mutex_lock (_ref)이 될 것입니까? – cateof
음. 스레딩 라이브러리에 구현할 부분이 그런 것으로 표시되었습니다. 어쨌든, 나는 pthread_mutex_t에 대한 빠른 구현을 참조 용으로 추가했다. – sehe
OS 세부 사항을 지정하기도 전에 답을 얻었습니다 :-) – cateof