본문 바로가기
프로그래밍/boost

boost::mutex

by neive 2012. 3. 26.
728x90

 

 

 

무슨 말이 필요할까... 일반 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 를 사용해주자

728x90

댓글