condition_variable 조건변수 주의점

C++의 condition_variable을 보게되면 아래의 코드가 나오는데 매번 cv.wait가  신경이 쓰였다. 일단 아래의 코드를 보자 논리적으로 보면 cv.wait의 두번째 인자가 있는이유가 딱히 없다는걸 알수있다. 헌데 왜 이코드가 들어갈까 이는 해당문서를 자세히 보면 알수있다. 위에 잘보면 이는 spurious wekeup라는 문서가 있을것이다.  이게 위키피디아에도 있는데 해당 문서를 잘보면 모든 OS에서 발생한다고 한다. https://en.wikipedia.org/wiki/Spurious_wakeup  깨우지않았는에도 더보기…

Redis 코드 삽질기(1)

이글은 redis 코드에 기여하기위해 간단한 리뷰이다.  시작시 initServer함수에서 코드의 일부분이다. 잘보면 ServerCron을 1초마다 실행시킨다.  해당 함수를 잘보면 서버가 동시접속과 리플리케이션 함수를 볼 수있게 구현이 된걸 볼수있다. ServerLog라는 함수가 있다. 이 함수는 redis의 자체적인 로그함수로 각각의 레벨이 존재한다.  이를 LL_NOTICE로 바꾸고 실행시켜보면 아래와 같이 출력된다. 참고로 listLength함수는 양방향 리스트 구조체의 길이를 더보기…

알고리즘 배낭문제

가장 흔한 문제인 배낭문제는 다양한 문제 풀이법이 있습니다. 먼저 가장 쉽게 재귀로 풀어보겠습니다. 재귀는 내가 이재품을 살때와 안살때를 재귀함수로 구현해주면됩니다. 일단 간단하게 배낭크기를 10으로 잡고 5개의 물건이 있다고 보면됩니다. 간단한 코드는 위와같다. 하지만 위의 코드는 계산했음에도 불구하고 계산할려는 특징이 있어 메모리로 계산을 했는지 안했는지 추가해야합니다. 이를 가지치기라고 하는데 다음에 설명하고 더보기…

스레드로 인한 메모리 시각화

스레드의 메모리영역의 읽기 쓰기 수정 같은 작업을 시각화 해주는 온라인 서비스를 발견하였습니다. 사이트는 http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/ 해당 프로그램은 모든 교차 실행을 판단하고 각 스레드를 시각해주는 역할을 합니다. 메모리 모델에 대해서는 다음의 링크를 참조해주시기 바랍니다. 해당툴로 스레드를 정의할려면 삼중 중괄호를 해주고 그안의 작업에 대해 정의를 할려면 괄호를 해주면됩니다. 일단 간단하게 두개의 스레드를 만들고 data 더보기…

C++ 두개중에 작은수를 유연하게 구하기

c++하면서 std::min을 사용하는데 이 함수의 문제는 min의 아규먼트의 타입이 같아야 합니다. 이러한 문제때문에 위의 C++ template 책에서는 이를 해결할려고 많은 시도를 보여줍니다.  결과적으로 막땅한 방법을 보여주지않고 max나 min의 함수를 이용해서 템플릿을 설명해줍니다. 결국 저만의 코드를 만들어 이를 해결해 볼려고했습니다. 코드는 다음과 같습니다. 메타 프로그래밍을 좀 이용하였습니다.  원리는 비교할려는 타입의 크기를 더보기…

WIN api를 이용한 스레드 생성

예전에 적었던 포스트를 정리 차원으로 해당 글을 포스팅합니다. 예전 싱글코어인 시절에는 운영체계가 여러프로게스들이 실행되도록 스케줄링을 작업을 해주었지만 (이를 멀티프로세싱) 지금 시점으로 멀티코어가 당연시 되면서 운영체계에서 여러코어들에 대해 멀티테스킹은 물론이와 멀티스레딩도 동시에 실행하게 되었습니다. 좀더 간단히 이야기하면 하나의 작업을 동시에 실행시키겠다라는 말이 됩니다. _beginthread함수도 있지만 이게 왜 만들어 졌는지에 대해 이야기하기전에 더보기…

메일의 통신과정과 헤더분석

작년쯤에 저희 사내 메일이 스팸메일로 빠지는 문제가 발생하여 이를 해결할려고 메일 헤더를 분석을 하였다. 메일의 통신과정에는 필요한거는 다음과 같다. (MUA,MDA,MTA)가 있고 전체적인 프로세스는 다음과같다. 앞서 말하기전에 약간의 팁인데 헤더는 뒤에서 앞으로 읽어야한다. 왜냐하면 메일을 다른 서버나 프로그램에 전달할때 마다 앞에 쌓이기때문에 결과적으로 맨처음의 부분을 볼려면 앞에서 부터 봐야한다. MUA는 우리가 더보기…

std::visit와 std::variant을 이용한 오버로딩

이 내용은 대부분은 https://www.bfilipek.com/2018/09/visit-variants.html 을 참조하였습니다. std::variant 클래스는 간단히 정의하자면 안전한 union 버전이라고 볼수있다. union의 최대의 단점은 타입의 값을 집어넣었을때 해당값이 int,string 알수 없다.이 단점을 회피하기위해 C++ 17에는 std::variant 클래스가 추가되었다.자세한 설명은 보자. http://occamsrazr.net/tt/323 https://en.cppreference.com/w/cpp/utility/variant std::visit함수는  std::variant 클래스에 담겨있는 타입에 맞는 operator을 호출을 해주는 함수이다. 자세한건 아래의 코드를 보자 1 2 더보기…

Visual Studio C++ 17 사용하기

Visual studio 2017에서 C++ 17문법을 쓰게 되면 컴파일이 아래와 같은 에러가 출력된다. Severity Code Description Project File Line Suppression State Error C1189 #error: class template variant is only available with C++17. ConsoleApplication1 c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.14.26428\include\variant 16 이는 말그대로 Visual Studio 2017에서 아직 C++17문법이 가능하지않다는 것이다. 하지만  en.cppreference.com 에 더보기…

WinApi Handle이란

WinApi를 하게 되면 주로 만나는 단어가 Handle이다. 도대체 이건 무엇일까? 라고 책을 봐도 이거에 대해 명확하게 설명이 되어있지 않다.  또한 MSDN에서도 다음과같은 내용말고는 없다. An object is a data structure that represents a system resource, such as a file, thread, or graphic image. An application cannot directly access object data or the 더보기…