프로그래밍
-
[c++] c++11에 추가된 표준 뮤텍스(mutex)프로그래밍 2014. 7. 14. 01:45
c++11에 추가된 mutex는 객체간 동기화를 돕는 라이브러리이다. mutex는 윈도우 환경에선 내부적으로 크리티컬 섹션(CriticalSection)을 이용한다. 헤더: mutex네임스페이스: std 1. mutex 가장 일반적인 mutex. lock, unlock, try_lock의 멤버 함수를 가진다. 2. recursive_mutex 중첩 lock을 허용하는 mutex. 단, lock을 한 만큼 unlock을 해줘야한다. 다음 상황은 lock이 된 상태에서 또 lock을 했다. 일반적인 뮤텍스라면 데드락 상태에 빠지겠지만 recursive_mutex은 중첩 lock을 허용한다. class memstream{ public: bool allocated() const { mutex.lock(); //..
-
[c++] 람다 캡쳐를 잘못 사용했다.프로그래밍/의문 2014. 7. 10. 03:07
Socket* socket = queue_.front(); impl_.async_accept(*socket, [&](const ErrorCode& error) // 전부 참조([&])로 했을 때 socket이 쓰레기 값으로 받아졌었다. { if (error) { throw error; } else { accepted_sockets_.push(socket); // 여기서 쓰레기 값이 대입이 됨 } } ); 생각없이 저 코드를 썼다. 당시엔 이상한 점이 없다고 생각했지만 -_-; async 함수가 비동기 함수이다. bind가 된 완료함수가 언제 불릴지 모른다는 말. 따라서 스택에 있던 Socket* socket의 값은 완료함수가 호출된 시점에선 쓰레기 값이 되고, 나는 그걸 참조해서 사용하려 했던 것이다. ..
-
[c++] typedef template<typename T> 템플릿 자료형의 이름 재정의 방법프로그래밍 2014. 7. 2. 20:18
typedef template array buffer 이런걸 하고 싶었는데 typedef와 template가 겹쳐서 컴파일 에러가 났다. 템플릿을 사용하는 자료형(vector, array, list 등등..) 또는 컨테이너는 typedef로 재정의를 할 수 없을까? 검색해보니 나만 저런걸 하고 싶었던 건 아닌 듯... -_- 비슷한 유형의 글이 어마어마하게 검색이 되었다. 하.지.만. c++11에선 저런걸 할 수 있다. 물론, 문법은 조금 다르지만! template using buffer_type = std::array; /// ... buffer_type buffer; // 길이 128의 바이트 타입 배열(버퍼) 템플릿 using 원하는타입명 = 자료형; 이와 같이 하면 된다. 굳.
-
[c++] inline 함수 사용의 경우프로그래밍 2014. 7. 2. 14:57
inline 키워드는 일반 함수 코드가 매크로와 비슷하게 동작하도록 만들며 컴파일 시에 함수 링크가 방식이 아닌 내부 코드를 직접 붙이는 처리를 한다.(컴파일러가 판단하여 효율성이 떨어진다고 생각할 시에는 inline 시키지 않기도 한다.) 따라서, inline 함수의 경우 여기저기서 자주 호출될 시에는 프로그램 코드 자체가 비대해지는 경우가 생긴다. 따라서 매우 작은 단위의 함수가 아니라면 여러곳에서 빈번히 호출되는 함수의 사용에는 적합하지 않다. inline을 어떻게 활용하면 좋을까 생각을 했는데 c++ 환경에서는 함수 오버로딩이 가능하므로 다음과 같은 상황을 처리하는 코드의 작성이 많다. void put(int val);void put(int a, int b); void put(int a, int ..
-
zl/memory_stream 네이밍프로그래밍 2014. 7. 2. 11:32
memory_stream 일반적으로, 메모리 조작을 돕는 클래스는 memory stream란 이름을 많이 사용한다.스트림의 정의는? http://terms.naver.com/entry.nhn?docId=838349&cid=209&categoryId=209 put 처음엔 push로 네이밍을 했었는데, put은 어떤 공간에 어떤걸 딱딱 맞게 넣는 느낌인 반면 push는 어거지로 데이터를 밀어넣는단 느낌이라 put을 선택했다. 근데 구현부를 생각하면 push가 어울리기도 한 듯 -_-; 삽입 데이터의 사이즈 체크를 안 하고, 오버플로우를 유발할 수 있으니까...하지만, 문제가 언제든 있을 수 있는 부분이 멀쩡하게 잘 돌아가는 것처럼 보이게 하는 것보단, 메모리 오버플로우 관련 에러를 미리 알 수 있는 것이 나..