Boost thread Library

Boost 두 번째, 오늘은 쓰레드 라이브러리에 대해 알아보겠습니다.


먼저, 쓰레드라는 것은 메모리에 올라가 있는 한 프로세스 내에서 실행되는 흐름의 단위를 일컫는 말입니다. 보통의 프로세스들은 한 개의 쓰레드를 가지고 있지만 경우에 따른 큰 프로세스들은 여러 개의 프로세스를 가지고 있는데, 이를 멀티 쓰레드라고 얘기합니다.


Boost에서 쓰레드를 사용하려면 아래의 헤더파일을 사용해야합니다.


#include <boost/thread.hpp>


or


#include <boost/thread/thread.hpp>


먼저 간단한 쓰레드 코드로 시작해보도록 합시다.



t 라는 쓰레드 변수를 사용해서 hello 함수의 내용을 쓰레드로 표현했습니다. 이후 실행되는 쓰레드의 주소를 가지고와서 출력해 쓰레드를 종료한 후의 주소를 가지고 와서 출력해봤습니다. 종료 후의 주소를 가져와서 출력한 이유는 정확히 쓰레드가 종료되어서 주소를 잃었는지의 확인 여부입니다.



쓰레드 주소를 출력했으며 쓰레드를 이용해 함수를 불러와 함수의 내용을 출력했습니다. 또한 쓰레드 종료 후에는 쓰레드 주소가 더 이상 표시되지 않는 것을 확인할 수 있습니다.


Boost thread library를 이용해서 스레드를 interrupt하는 것도 쉽고 간단하게 가능합니다.



위 소스를 통해서 interrupt()을 통해 쓰레드를 interrupt를 시킬 수 있습니다. 확인은 thread 함수에서 try catch 문을 준 것처럼 thread interrupted!를 통해서 확인하실 수 있습니다.





Boost thread library의 단점.


사용해보면서 느낀 것이지만 Boost thread library에는 단점들이 있습니다. 먼저 저는 Boost Library 1.53 버전의 라이브러리를 사용합니다. 그런데, 특히 boost/thread.hpp의 소스를 포함할 때, 컴파일 할 때도 그렇지만 잘못된 object 파일 생성으로 정확한 결과의 도출은 커녕 전혀 엉뚱한 걸과를 출력해버리는 현상이 나타납니다. 물론 버전의 따른 차이가 있겠습니다만 아직 Boost Library는 개발 단계 중인 라이브러리로 thread 이외 좀 더 버그가 있을 것이라 생각합니다. object 파일의 오차는 Eclipse의 경우 clean으로 해결이 가능하고, 일반 콘솔 컴파일의 경우, 기존의 object 파일 또는 out 파일을 제거하시고, 다시 컴파일 하면 정확한 결과가 나오기는합니다만 잘못된 결과가 나오는 경우도 간혹 존재합니다. 그래서, 필자는 위 코드 중에서도 boost/thread.hpp보다는 boost/thread/thread.hpp의 사용을 권장합니다. 소스를 직접 보시면 왜 그런 현상이 나타나는지 조금은 이해가 될겁니다 ^^;


또 한가지, g++ 명령어를 통한 콘솔 컴파일을 하시는 경우, 일반적인 컴파일 방법으로는 컴파일이 안되는 경우가 있습니다. g++ 명령어로 컴파일 할 때는 l 옵션인 라이브러리 옵션을 사용해서 boost_system과 boost_thread 항목을 추가해주셔야 합니다. Eclipse 사용자의 경우, 프로젝트 옵션에서 Library Settings에 반드시 boost_system과 boost_thread를 추가해주셔야 합니다. 그렇지 않으면 구문이 정확한 코드인데도 불구하고, 오류를 출력하게 됩니다.



일반적으로 object 파일만 주고 컴파일 할 경우.



l 옵션을 주고 라이브러리를 지정해야합니다.



이클립스의 경우, 프로젝트 정보에서 g++ Linker 부분에 라이브러리를 직접 지정해주시고, OK 눌러주신 다음 빌드하면 됩니다.



comments powered by Disqus

Tistory Comments 0