Program/C & C++

[boost] boost 동기화 객체 boost::shared_mutex

너구리V 2013. 3. 28. 16:29

요즘 C++멀티플랫폼(리눅스, 윈도우즈) 서버쪽 작업을 하다보니 No Windows API를 추구하게 되네요 ㅠㅠ ㅋ

 

결국 boost도 윈도우상에서 돌아가면 내부적으로 windows api를 이용하고 있을텐데

 

리눅스로 포팅을 하게 되면 작업을 두번 작업을 해야되서 boost를 활용하게 되네요 ;;;

 

이번에는 멀티쓰레딩 개발시에 필요한 동기화기법에 대해서 설명하고자 합니다.

 

요즘 각각의 라이브버리 동기화객체를 제공하고 있는데, 이전까진 tbb(Threading Building Block)를 이용해서 했었는데,

 

이번엔 궂이 동기화 객체땜에 tbb 라이브러리를 쓰는것보단, 기존에 사용하고 있는 boost 동기화 객체를 이용하고자

 

이번 계기로 설명하고자 합니다. ^^

 

보통 락에는 wirte lock, read lock이 필요로 하겟죠. no lock 같은 많이 불안정하겠죠. 이 객체를 읽는 도중에 언제 사라질지 모르니

 

부담감이ㅋㅋ물론 사라지지 않는다면야 nolock도 좋겠죠? 뭐든지 상황에 따라서^^ ㅋㅋ

 

boost에도 역시 C++ 종합 라이브러리라서 그런지 ㅋㅋwrite lock, read lock을 자연스레 지원합니다.

 

boost::shared_mutex

boost::scope_lock<boost::shared_mutex>

boost::upgrad_lock<boost::shared_mutex>

boost::unique_lock<boost::shared_mutex>

boost::upgrade_to_unique_lock<boost::shared_mutex>

위의 객체들로 read lock , write lock을 구현할 수 있습니다.

 

기본적인 read lock은

boost::shared_mutex mutex_;

 

{

boost::scope_lock<boost::shared_mutex> lock(mutex_);  // read lock

...

}

 

write lock

{

boost::unique_lock<boost::shared_mutex> lock(mutex_); // write lock

}

 

그리고, read lock 상테에서 write lock으로 전환하고 싶을경우에는

{

boost::scope_lock<boost::shared_mutex> lock(mutex_); // read lock

.....

{

boost::upgrade_lock<boost::shared_mutex> u_lock(mutex_);
boost::upgrade_to_unique_lock<boost::shared_mutex> w_lock(u_lock);

...

}

 

}

반응형