2008-02-09

boost::test thread safe

다른 표준 라이브러리와 마찬가지로, boost::test 역시 멀티쓰레드에 대해서 안전하지 않다. 물론 BOOST_CHECK 등의 테스트 매크로들은 내부적으로 싱글톤을 사용하기 때문에, 쓰레드 함수 내부에서 사용하더라도 실패할 경우 에러 메시지를 출력해주지만, 다른 쓰레드에서 동일한 순간에 역시 같은 매크로를 호출하게 되면 콜스택 깊은 곳에서 난감한 에러를 뱉어버린다.

이걸 해결하려면 결국 mutex 로 테스트 매크로들을 wrap 한 또다른 매크로를 만들어서 써야 하는 수 밖에 없다.


#define SAFE_BOOST_CHECK_EQUAL(m,x,y) { \
boost::mutex::scoped_lock lock(m); \
BOOST_CHECK_EQUAL(x,y); }

void boost_check_always( boost::mutex * m )
{
boost::timer timer_;

while(timer_.elapsed() < 10.f )
{
SAFE_BOOST_CHECK_EQUAL(*m,1,1);
}

}

BOOST_AUTO_TEST_CASE( test_boost_check_always )
{
boost::mutex m;
boost::thread t(boost::bind(boost_check_always,&m));

boost::timer timer_;
while(timer_.elapsed() < 10.f )
{
SAFE_BOOST_CHECK_EQUAL(m,1,1);
}

t.join();
}

comments powered by Disqus