[C++] 필수 라이브러리 Boost 설치하기(boost::asio::threadpool 예제)


Development note/C , C++ , MFC  2020. 4. 23. 18:19

안녕하세요. 명월입니다.


이 글은 C++의 필수 라이브러리 Boost 설치하기(boost::asio::threadpool 예제)에 대한 글입니다.


프로그램을 개발하면 오픈 소스 라이브러리를 참조 해야 할 때가 많습니다.. 기본적인 언어의 문법과 STL(표준 템플릿 라이브러리)만으로 프로그램을 개발하기에는 양이 너무 많고, 모든 것을 테스트 및 검증을 할 수가 없기 때문에 검증된 외부 라이브러리가 필요합니다.

Java나 C#은 maven이나 Nuget등의 패키지 관리자가 있어서, 등록된 오픈 소스 라이브러리를 검증하고 사용자에게는 의존성을 자동으로 설정해 주는 프로그램 개발을 좀 더 편하게 해주는 프로그램이 있습니다.

C++도 있을지도 모르겠는데 현재 제가 알기로는 모르겠네요...(저의 C++의 지식은 거의 6~7년전으로 멈춰져 있기 때문에.. 혹시 아시는 분은 알려주세요..)


그렇다고 인터넷 구글링으로 검색해서 라이브러리를 막 다운 받고 사용하기에는 검증이 되지 않아 사용하기가 조금 불안합니다.

그래도 C++에도 필수 라이브러리를 모아놓은 라이브러리 집합이 Boost입니다. 꽤나 검증된 라이브러리이고 라이선스도 BSD로 자유롭게 수정 배포 가능하니 C++ 개발자로서는 거의 필수적으로 설치하는 라이브러리입니다.

링크 - https://www.boost.org/


boost 페이지에 접속을 하면 다운로드 항목에 메인에 있습니다.

현재(2020.04.23)는 1.72.0버전입니다.

일단 윈도우 버전에서 사용할 것이기 때문에 window 버전으로 설치합니다.


zip파일을 다운로드 받고 적당한 곳에 압축을 풉니다.

그리고 bootstrap.bat 파일을 실행시킵니다.

msvc로 boost을 빌드하라고 메시지가 나옵니다.


여기서 boost를 빌드하기 전에 msvc의 버전을 확인이 필요합니다.

먼저 비주얼 스튜디오를 실행하고 C++ 프로젝트에서 아래와 같이 소스를 작성하고 실행합니다.

#include <stdio.h>
#include <iostream>
#include <crtdbg.h>
#if _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endif
using namespace std;
int main()
{
  cout << _MSC_VER << endl;

  _CrtDumpMemoryLeaks();
  return 0;
}

저의 경우는 1925라는 결과가 나왔네요.

이걸 가지고 위키 백과에서 C++ history에 보면 버전이 나와있습니다.

참고 - https://en.wikipedia.org/wiki/Microsoft_Visual_C++


저의 경우는 14.25 버전이네요.


이제 Visual studio 콘솔 화면으로 boost를 빌드하겠습니다.

# 셀 address-model의 경우 32비트면 32, 64비트면 64를 입력. toolset은 위 msvc의 버전을 입력하면 됩니다.
b2 toolset=msvc-14.25 variant=debug,release link=static threading=multi address-model=64 runtime-link=static

빌드가 완료가 되면 compiler include path와 linker library path가 나옵니다.


이제 이걸 개발할 때 추가하면 됩니다.

이제 boost 라이브러리를 사용할 준비가 끝났습니다.


먼저 boost 라이브러리가 무엇이 있는지 확인하겠습니다.

boost가 설치된 폴더의 index.html를 실행하면 library 일람을 확인할 수 있습니다.

C++의 STL에는 thread는 있는데 쓰레드 풀이 존재하지 않습니다.

쓰레드풀은 Thread를 생성하는데 있어서 pool 내의 thread의 갯수 제한과 쓰레드 재사용, 메모리 해제등을 관리하는 클래스입니다.

Thread 자체가 프로그램의 성능을 향상시키는 기능이 있지만, 반대로 너무 무분별하게 사용하게 되면 오히려 역효과가 나기 때문에 pool로 제어를 해야합니다.

링크 - [C++] 쓰레드(Thread)를 사용하는 방법

#include <stdio.h>
#include <iostream>
#include <crtdbg.h>
// boost의 asio라이브러리 크로스 플렛폼에 관계된 라이브러리
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>
#if _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endif
using namespace std;
using namespace boost::asio;
using namespace this_thread;
using namespace chrono;
// 쓰레드 예제함수.
void threadTest() 
{
  // 반복문을 돌면서 콘솔에 값을 출력한다.
  for (int i = 0; i < 4; i++) 
  {
    cout << i << endl;
    sleep_for(microseconds(1));
  }
}

int main()
{
  // thread pool 내에 thread 최대 갯수를 한개로 제한한다.
  thread_pool* pool = new thread_pool(1);
  // 쓰레드 실행
  post(*pool, threadTest);
  // 쓰레드 실행
  post(*pool, threadTest);
  // 쓰레드 실행
  post(*pool, threadTest);

  // pool 내의 모든 쓰레드가 종료할 때까지 기다린다.
  pool->join();
  // 메모리 해제
  delete pool;
  // 메모리 릭체크 함수.
  _CrtDumpMemoryLeaks();
  return 0;
}

소스는 쓰레드를 동시에 3개를 실행시켰는데 pool의 쓰레드 제한을 하나로 설정하니 하나하나 실행되는 것을 확인할 수 있습니다.


여기까지 C++의 필수 라이브러리 Boost 설치하기(boost::asio::threadpool 예제)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.