본문 바로가기

Boost30

boost::atomic & lockfree boost_1_53_0 에 드디어 lockfree 정식 등록... 이제 Tim 씨 홈페이지에서 받아서 덮어쓰는 수고를 덜겠군요... Tim 씨 축하합니다 :) 예제 첫번째 예제. vector 에서 쓰레드 4개로 순차적으로 숫자를 뽑아 사용하고 버렸을 때 ㅎㅎ 해보지 않아도 끔찍하지요.. 돌아갈리가 없습니다 #include "stdafx.h" #include std::vector g_NumList; void WorkerFunc() { while(true) { if(!g_NumList.empty()) { int n = g_NumList.back(); std::cout 2013. 6. 14.
boost 라이브러리 설치 1. 라이브러리를 다운로드 (http://www.boost.org/users/history/ 에 가서 최신 버전을 받자) 2. 다운로드 받은 파일을 압축해제해서 라이브러리를 저장할 곳에 압축을 푼다 3. 압축을 푼 폴더로 들어가 boostrap.bat 을 실행 시킨다 4. cmd (윈도우버튼 + R 누르고 cmd 엔터) 실행 시켜서 압축 푼 폴더로 들어간다 5. 아래의 명령어를 입력 후 엔터 b2 toolset=msvc-10.0 variant=debug,release link=static threading=multi address-model=32 runtime-link=static 비주얼 스튜디오 버전에 따라서 msvc-10.0 을 8.0 이나 11.0 으로 고쳐준다. 라이브러리 경로를 바꿔주고 싶다면 .. 2013. 6. 12.
boost::ptr_unordered_map std::map 과 같지만 일반적으로 속도가 더 빠른 것으로 알려져 있는 unordered map 과 소스를 ptr 로 썼을 때의 안정성을 강화시키는 ptr_ 시리즈를 합해 ptr_unordered_map 이라는 컨테이너가 있습니다. 별도의 clear 를 호출 하지 않아도 메모리의 누수가 발생하지 않습니다. boost::shared_ptr 과의 상성이 좋다고 추천하고 있으니 같이 써 보도록 하지요 예제 #include "stdafx.h" #include #include #include #include class CTest { float m_fLifeSec; boost::timer m_Timer; public: bool m_bDeleteMe; void Run() { if(m_Timer.elapsed() >.. 2013. 5. 24.
Asio Client / Server NetEngine 어떤 엔진에서도 사용이 가능하도록 DLL 로 Server / Client NetEngine 으로 만들어 봤습니다 구조는 흔해빠진 디자인패턴 클라이언트 / 서버를 기초로 제작 했습니다 서버나 클라이언트 같은 구조를 가지고 있습니다 다만 클라랑 서버랑 보내고 받는 쪽 역활이 바뀔 뿐 사용된 것 - Asio - thread - thread group - function bind - shared pointer - posix timer - pool - lockfree queue - queue - tuple - byte streaming - byte encrypt decrypt - callback map - multi index map - program options 2012. 11. 22.
ShootingStar 2012 2003년 제대하고 DX9 이 새로 나온 것을 발견하고 감각을 찾고자 만들어봤던 슈팅게임 ShotingStar 그러나 내부 구조는 그다지 스마트하지 못했는데 이번에 라이트한 3D 엔진을 만들면서 그 엔진을 이용 해 옛날 ShotingStar 를 새롭게 복원해 보기로 했습니다 그저 나누기만 하면 멋진줄 알고 개판쳤던 기존의 프로젝트에서 엔진 DLL 을 베이스로 한 심플한 구조로- 사용된 것 들 - DirectX9 - DirectX Input - vector - shared pointer - thread group - shared mutex - multi index map - Actor Based Multi Override title 에서 enter 를 쳐야 넘어가집니다 2012. 11. 22.
boost::program_options 응용 프로그램을 아규먼트를 넘겨줘서 실행하고 싶을 때 _CHAR* argv 처리한다고 이렇게 만들고 저렇게 만들고 사람마다 다 다를 꺼라고 봅니다. 이것을 시간낭비하지 말고 program_options 를 이용해서 일관되게 만들면 서로 서로 불편할 일 없겠죠 :) 예제#include "stdafx.h" #include namespace po = boost::program_options; int _tmain(int argc, _TCHAR* argv[]) { // 아규먼트 옵션에 대한 설명 po::options_description desc("사용가능한 옵션들"); desc.add_options() ("help", "도움말을 봅니다") ("ip", po::value(), "접속할 서버의 ip 를 입력합니다".. 2012. 11. 16.
boost::function / boost::tuple 의 활용 function callback map 을 만들고 거기에 tuple 을 이용한 변수의 적용을 하는 예제를 만들어 보았습니다 제가 실제 활용한 것은 어떤 패킷에 대한 콜백 처리와 서버 접속자에 대한 send 처리에 활용을 했지요 여기에 템플릿까지 잘 적용하면 더 멋진 모습이 되지만 일단 본 내용에서 전달하고자 하는 취지와는 안맞으니 생략 합니다 :) 예제 소스 #include "stdafx.h" #include #include // 본 예제와는 관계 없음, 다만 BYTE 정의 때문에 추가 #include #include #include class CTestMng { typedef boost::functionTYPE_CNT_CB; std::map m_CallbackMap;// 유저 id 와 send 콜백 맵.. 2012. 11. 7.
boost::tuple / tuples / tuples::tuple 여러개의 변수를 주고 받거나 동시에 다뤄야할 때 유용한- 대표적으로 변수는 하나 넘겨줘야되는데 많은 양의 정보를 넘겨줄 때 유용 할 것 같네요 예제 소스 #include "stdafx.h" #include #include #include #include #include #include class CTest { int m_nVal; public: CTest() : m_nVal(0) {} CTest(int n) : m_nVal(n) {} }; // 생성 및 초기화 boost::tuple t0; boost::tuple t1; boost::tuple t2(3);// 3으로 초기화 boost::tuple t3; boost::tuple t4(CTest(1));// 1로 초기화 boost::tuple t5(t2);/.. 2012. 11. 6.
boost::shared_ptr 과 Virtual Function 과 boost::timer 가상함수를 더 스마트하게 사용하는 방법. shared_ptr 을 이용한 간단한 게임모드 변경을 예로 예제를 작성하였습니다. 실제 최근 개발한 개인 프로젝트에서도 사용한 방법이지요 게임모드 외에도 엑터 관리나 상속을 통해서 만드는 모든 구조에 대해서 응용이 가능합니다 예제 #include "stdafx.h" #include #include #include #include class CGameMode { public: virtual void Run() = NULL; }; class CLogo : public CGameMode { public: void Run() { std::cout 2012. 10. 25.
boost::random http://www.boost.org/doc/libs/1_51_0/doc/html/boost_random.html boost 에서 랜덤 생성도 제공해 줍니다 rand(time(0)) 을 쓸때 생기는 흔한 (혹은 뻔한) 패턴을 피해서 각자 만들곤 하는데 그런 노고를 안해도 될 듯 하네요 1~6 랜덤 숫자 구하기 #include int GetDice() { boost::random::mt19937 rng; boost::random::uniform_int_distribution six(1,6); return six(rng); } 특정 숫자 범위내에서 구하기 #include #include int GetRand() { boost::random::mt19937 gen; boost::random::uniform_i.. 2012. 10. 24.
boost::asio 비동기 서버/클라 step 2 2011/11/09 - [프로그래밍/boost] - boost::asio 비동기 서버/클라 step 1 에 이어서 계속 됩니다 Client -> Recv -> Recv Queue -> Worker Thread -> Send Queue -> Send Callback -> Client 분홍색 까지의 부분을 소스 예제로 봅시다! 어디까지나 예제 차원으로 (원래 asio 예제도 그렇고) class 내부에 막 때려넣었으니 따라하거나 이상한 코딩하는 사람으로 오해하지마세요 ^^; 소스 퍼가실 때 소스코드 부분을 더블 클릭해서 전체 선택 후 카피가 좋습니다 드래그 하면 한줄로 복사되요 컴파일 관련은 이전 글을 참고해 주세요 새롭게 class 가 하나 추가 됐습니다. Worker 인데요 사용된 기술은 boost::lo.. 2012. 9. 25.
boost::asio 비동기 TCP 서버 / 클라 예제 boost asio 안내서에 있는 기본 예제를 응용하여 작성했으며 컴파일러 옵션은 /Mtd 로 해야 합니다. 클라이언트 부분의 const string 은 내 IP 로 수정해줘야 합니다. 기존에 올렸던 내용은 소스 링크가 깨져서 다시 올립니다 (많은 분들이 보러 오셨는데 ㅠㅠ 깨져있었을 줄이야..) 소스는 퍼가실 때 소스 부분을 더블클릭하면 아랫쪽에 작은 창이 뜨면서 ctrl+c 로 전체 카피가 가능합니다 클라 소스#include "stdafx.h" #include #include #include #include const std::string _MY_IP("192.168.25.2 2012. 9. 3.
boost::Program_options http://www.boost.org/doc/libs/1_49_0/doc/html/program_options.html 바이너리 아규먼트를 쉽게 만드는 라이브러리~ 예제는 다음에 작성해보기로 한다.. 기존의 서버 예제에 넣으면 좋을 듯 2012. 5. 14.
boost::multi_index boost::multi_index 는 키와 데이터 양쪽 모두가 키가 될 수 있는 형식의 컨테이너를 제공한다 흔한 사용 예는 '파티 시스템'에서 파티인덱스를 통해서 맴버들을 구할 수 있는게 보통의 map 이라면 파티원의 이름으로도 파티인덱스를 역추적한다던가 하는 것이 가능하다 또 하나의 예로는 '아이템 조합 시스템'에서 보통은 결과물 인덱스를 통해서 재료들을 알 수 있지만 multi_index 로는 재료를 가지고 만들 수 있는 모든 결과물의 인덱스를 역추적 할 수 있다 물론 map 으로도 구현 가능한 것들이지만 이렇게 되면 다수의 map 을 만들고 한개의 인덱스값을 공 유해야 한다 예제// 가독성을 높이기 위해 풀어서 써놨으니 이해하는데는 도움이 될...듯? struct SKey { int nIndex;/.. 2012. 3. 30.
boost::asio 로 만들어 보고 싶은 서버 구조 I/O서버는 클라이언트, Game서버, DB서버와 인풋, 아웃풋을 처리 Game 서버는 실제 게임 로직을 수행한다 파티 매칭 서버는 모든 서버군과 연동하여 파티를 맺을 수 있도록 도와준다 전장서버나 인던서버는 사실상의 각 서버군의 Game 서버 와 같지만 인던이나 전장 관련 로직만 수행한다 다른 서버와 파티를 할 때, 모든 서버군은 게임내 전체 파티 리스트를 공유하고 한 서버가 죽었을 때 방장이 있는 서버에서 파티관련 로직을 처리 한다. 나중에 죽었던 서버가 살아나면 다른 서버의 파티 정보를 가져와 복구시킨다 asio 서버로 간단하게 구현해 보자 -_- 2012. 3. 28.
boost::mutex 무슨 말이 필요할까... 일반 2개의 스레드로 카운팅한 결과 출력과 mutex 를 적용 한 다음 출력되는 결과를 비교해보자~ 예제 #include #include class CTestClass { boost::shared_mutex m_SharedMutex; public: int m_nCount; void Run() { std::wcout write) boost::upgrade_lock lock(m_SharedMutex); std::wcout 2012. 3. 26.
boost::unordered set, map, mutiset, multimap boost 에서 지원하는 set, multiset, map, multimap 입니다 hash 로 동작하고 일반적인 stl 보다 빠르니 사용해보는게 좋겠죠 boost::unorder_xxx 형태로 정의되어있으니 찾아봅시다. 예제 #include #include #include #include #include #include #include #include #include #include #include class CTest { typedef boost::unordered_set IDSet; typedef boost::unordered_map SetMap; SetMap m_DataMap; public: void Run() { IDSet temp; temp.insert(1);// 데이터 값 아무거나 넣기 m_.. 2012. 3. 26.
환경 변수 설정 Boost 나 기타 라이브러리 쓸 때 매번 버전 바뀌고 개인별로 설치한 위치도 다르고 하면 골치 아프니 팀개발이나 버전 관리할 때 환경 변수를 등록해두면 좋다.. 2012. 3. 2.
boost::bind 의 기본 사용법 예제 boost::bind 의 이용 예제.. 사실상 응용이라던가 더 복잡한 쓰임은 있지만 대략 이런 역활을 한다 는 것을 익힐 뿐이고 상세한 이용은 검색을 더 해보는 것이 좋을 듯. 실제 asio 에제를 보면 더 많이 , 여러기능이 쓰이는 것을 알 수 있다 예제 // start #include "stdafx.h" #include #include #include #include #include int no_arg() { return 0; } struct one_arg { int operator () (int i) const { return i; } typedef int result_type; }; struct two_arg { int val; two_arg(int v) : val(v) {} int f(int i.. 2011. 11. 16.
boost::mem_fn 예제에 std::tr1::tuple 예제의 조합 mem_fn 을 이용해서 어떤 공통된 function 을 구동 시키되 넘기는 변수는 tuple 을 이용해 유동성 있게 넘기는 방법을 예제로 만들었습니다 1타 2피! 예제랄까... serialize 때 조금 심플해 보일 순 있겠네요.. 가독성이나 처리 문제등 개선점은 있지만;; // start #include "stdafx.h" #include #include #include #include class CWork { private: typedef void(*const fun)(); std::tr1::reference_wrapper m_RunFunc; int m_Val; public: void SetWrapper(std::tr1::reference_wrapper f) { m_RunFunc = f; } tem.. 2011. 11. 15.