무슨 말이 필요할까... 일반 2개의 스레드로 카운팅한 결과 출력과 mutex 를 적용 한 다음 출력되는 결과를
비교해보자~
예제
#include <boost/thread/shared_mutex.hpp> #include <boost/thread.hpp> class CTestClass { boost::shared_mutex m_SharedMutex; public: int m_nCount; void Run() { std::wcout << "Run..." << std::endl; m_nCount = 0; boost::thread_group tg; tg.create_thread(boost::bind(&CTestClass::Work, this)); tg.add_thread(new boost::thread(boost::bind(&CTestClass::Work, this))); tg.join_all(); std::wcout << "End :) "; int n; std::cin >> n; } void Work() { while(m_nCount < 10) { // read lock //boost::shared_lock<boost::shared_mutex> lock(m_SharedMutex); // write lock //boost::unique_lock<boost::shared_mutex> lock(m_SharedMutex); // change able lock (read -> write) boost::upgrade_lock<boost::shared_mutex> lock(m_SharedMutex); std::wcout << "Cur Count : " << m_nCount << " : @_@;;; " << std::endl; boost::upgrade_to_unique_lock<boost::shared_mutex> ulock(lock); ++m_nCount; } } CTestClass(void); virtual ~CTestClass(void); };
Work() 안의 lock 부분을 모두 주석 처리했을 경우의 출력은
Run...
Cur Count : Cur Count : 0 : @_@;;;
Cur Count : 1 : @_@;;;
Cur Count : 2 : @_@;;;
Cur Count : 3 : @_@;;;
Cur Count : 4 : @_@;;;
Cur Count : 5 : @_@;;;
Cur Count : 6 : @_@;;;
Cur Count : 7 : @_@;;;
Cur Count : 8 : @_@;;;
Cur Count : 9 : @_@;;;
0 : @_@;;;
End :)
이 처럼 0 번 카운팅하고 wout 하는 그 순간에도 다른 간섭이 일어나 Cur Count : 다음에 다른쪽 스레드의 0 카운팅한
게 끼어들어온다 어쨋건 의도한 10번의 카운팅은 되었지만 이래서는 애로사항이 꽃핀다;
Work() 안의 lock 부분을 처리해 주면-
Run...
Cur Count : 0 : @_@;;;
Cur Count : 1 : @_@;;;
Cur Count : 2 : @_@;;;
Cur Count : 3 : @_@;;;
Cur Count : 4 : @_@;;;
Cur Count : 5 : @_@;;;
Cur Count : 6 : @_@;;;
Cur Count : 7 : @_@;;;
Cur Count : 8 : @_@;;;
Cur Count : 9 : @_@;;;
Cur Count : 10 : @_@;;;
End :)
순서대로 나온다...
읽기 전용인지 쓰기 전용인지 잘 선택해서 shared, unique 를 사용해주자
'프로그래밍 > boost' 카테고리의 다른 글
boost::multi_index (0) | 2012.03.30 |
---|---|
boost::asio 로 만들어 보고 싶은 서버 구조 (0) | 2012.03.28 |
boost::unordered set, map, mutiset, multimap (0) | 2012.03.26 |
boost::bind 의 기본 사용법 예제 (0) | 2011.11.16 |
boost::mem_fn 예제에 std::tr1::tuple 예제의 조합 (0) | 2011.11.15 |
댓글