프로그래밍/c++
-
boost::lockfree::queue의 타입 제한(error C2338)프로그래밍/c++ 2016. 1. 13. 02:57
boost lockfree queue는 trivial 타입만 사용할 수 있다. 123boost::lockfree::queue int_queue; // ok boost::lockfree::queue string_queue; // error! trivial 타입 조건?0. 어떤 생성자도 없음1. 가상 함수 없음2. 소멸자 없음memcpy로 인스턴스 복사를 해도 아무런 문제가 없을 그런 타입을 trivial이라 부른다. 123456789101112131415161718// Trivial Typestruct A{ void* buf; size_t size;}; // Non Trivial Typestruct B{ B(): buf{nullptr}, size{0} { } void* buf; size_t size;}; ..
-
shared_mutex, 그리고 upgrade_lock.프로그래밍/c++ 2015. 12. 28. 09:25
shared_mutex? 읽기/쓰기 락을 지원하는 뮤텍스.데이터를 수정하지 않고 읽기만 한다면, n개의 스레드에서 접근하더라도 아무런 문제가 없다.하지만 쓰기, 수정이 일어나야 한다면? 읽기도 막아야한다.따라서, 읽기만 하는 상황에선 읽기 락을 걸어 n개의 스레드에서 접근이 가능하도록 하고,쓰기를 해야 할 상황에선 1개의 스레드에서만 접근 가능하도록 하는 락을 지원하는 뮤텍스이다. 이 락 readers writer lock이라고도 불림. 지금(2015/12/xx) 기준으론 boost 라이브러리에만 존재하지만, c++17에는 공식적으로 편입될 예정(http://en.cppreference.com/w/cpp/thread/shared_mutex) 헤더는 #include 그리고 boost::shared_mute..
-
vs2015 update1에서 c++17 module 기능 사용하기프로그래밍/c++ 2015. 12. 16. 13:12
비쥬얼 스튜디오 2015 update1에 c++ 17에 포함될 예정인 module을 사용할 수 있다. 프로젝트를 만들고, ixx 확장자의 파일을 하나 추가한다. ixx 파일 내부를 작성한다. ixx파일의 속성탭을 누른다. cpp라면 기본적으로 c/c++ 컴파일러로 설정이 되어있지만, ixx파일은 직접 설정을 해줘야 한다. 구성 속성 => 일반으로 가서 test.ixx의 항목 형식을 c/c++ 컴파일러로 지정한다. 프로젝트=>속성을 누른다. 구성 속성 => C/C++ => 명령줄로 가서 추가 옵션에 /experimental:module 라고 쓴다. main.cpp를 만들고 내부를 작성해서 빌드! ~! 성공 + 클래스 모듈 testclass.ixx1234567891011121314151617181920212..
-
좀 인상 깊었던 mutable 키워드의 활용프로그래밍/c++ 2015. 12. 1. 01:41
boost::thread_group 코드를 보다가 인상이 깊은 작은 코드가 있었다.정말 별거 아닌데 mutable이란 키워드의 활용을 알았다.c++을 처음 공부할 당시에나 얼핏 봤던 키워드인데, 잊고있었다.그러다가 boost/thread_group의 코드를 보는데mutable은 이럴때 쓰는거야 하고 가르쳐주는 코드가 있더라. 12345678910111213141516class thread_group//... public: size_t size() const { boost::shared_lock guard(m); return threads.size(); } // ... private: std::list threads; mutable shared_mutex m; Colored by Color Scripter..
-
boost python + lambda프로그래밍/c++ 2015. 11. 20. 11:01
Boost python + lambda 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970// 실패 script_dict["lobby_class"] = py::class_("lobby_class", py::no_init) .def("name", &lobby::name) .def("async_accept", [&lobby_](const std::string addr, unsigned short port){ … }) ; // 실패auto async_accept = [&lobby_](const std::string& addr, ..
-
pyd 파일 없이 c++과 python 연동하기프로그래밍/c++ 2015. 11. 20. 05:44
pyd 파일 만들지 않고 c++과 Python 연동하기 서버 코드에 일부 변동될 수 있는 부분들을 스크립트로 빼고 싶었다. 유저 accept를 할 포트, 최대 유저 수, 방 인스턴스 수 등등.. 부터,특정 상황마다 콜백이 불려서 뭔가를 체크하는 간단한 행동 정도면 오케이.그리고 석찬이 형이 테스트 할 부분을 스크립트로 빼면, 형도 부담 없이 이런저런 수치를 바꿔보며 테스트를 할 수도 있고, 나는 다른 작업을 할 수 있으니까 편할 것이다. 고작 졸업 프로젝트 정도인데? 라고도 생각할 사람도 있겠지만, 다른 스킬들을 익혀봐야 나쁠 거 없으니까. 여튼, 단순히 변수의 값을 설정하는 정도라면 텍스트 파일 정도로만 빼도 상관이 없었지만 약간의 처리 로직까지 첨부가 되어야한다면 텍스트 파일 정도로는 부족한 걸 사실..
-
[c++] std::vector를 boost::python::list로프로그래밍/c++ 2015. 11. 19. 11:41
12345678910template boost::python::list vector_to_pylist(const std::vector& v){ boost::python::object get_itor = boost::python::iterator(); boost::python::object iter = get_itor(v); py::list pylist(iter); return pylist;} Colored by Color Scriptercs 참고 http://stackoverflow.com/questions/6157409/stdvector-to-boostpythonlist
-
std::map insert, emplace, try_emplace프로그래밍/c++ 2015. 11. 6. 12:54
123456789101112// 유저를 레이어에 추가합니다.void login_layer::push(std::shared_ptr s){ auto id = s->get_id(); // 세션을 추가합니다. users.insert(std::make_pair(*id, user{ s })); users.emplace(*id, user{ s }); users.try_emplace(*id, s); // 메모리에 직접 생성한다. 복사 없음!}Colored by Color Scriptercs try_emplace는 키와 값을 모두 메모리에 직접 생성한다.(값의 복사 생성자를 지워도 빌드가 된다!)12345678class user{public: user(const user& other) = delete;// ...}; C..