[개요] C++로 작성된 회사 프로젝트에서 Onvif를 연동한 소스코드가 있는데, profileMutex, streamMutex 등의 뮤텍스를 사용하여 PTZ와 Onvif SDK를 사용하였다. 위의 각 PTZ 함수들이 모두 profileMutex를 잠근 후 사용하고 있는데, 문제는 뮤텍스를 사용하는 함수에서 또 뮤텍스를 사용하는 다른 함수를 호출하는 경우가 존재한다. 위 함수는 SetPreset() 함수인데, 처음에 profileMutex를 잠근 후에 아래에서 RemovePreset()을 호출하고, 다음에는 GetPresets()를 호출하고 있다. 이 코드는 그나마 리팩토링이 되어서 이중락이 발생하지 않도록 수정되었으나, 다른 함수들에서도 이런 경우가 발생할 여지가 높아보이도록 코드가 작성되었다. [개선..
[개발환경] OS : Windows 10 Pro 디스크 : C 드라이브 SSD 512GB, D 드라이브 HDD 2TB (HDD에 Boost 설치 예정) IDE : Visual Studio 2017 v15.9.29 목표 빌드 비트 : 64비트 Boost 버전 : v1.59.0 [Boost 다운로드] 2020년 11월 현재 Boost 1.59 버전을 사용하고 있으므로 여기에서 해당 버전을 zip 파일로 다운로드 받습니다. D 드라이브에 HDD가 설치되어 있다면 D:\ 경로에 압축파일을 해제합니다. 그러면 D:\boost_1_59_0 폴더 안에 Boost 관련 데이터가 생성됩니다. [Boost 빌드] 버튼을 클릭하여 "x64 Native Tools Command Prompt for VS 2017"을 클릭하여 ..
두 컴파일러 MSVC++ v14.26와 Mingw-w64 v8.1.0에 대해 각각 같은 코드의 피보나치 수열의 성능을 측정함 운영체제: 윈도우 10 프로 64비트 컴파일러 C++ 버전: C++17 MSVC의 경우 O2 최적화 사용함 CPU: AMD Ryzen 7 1700 8-Core Processor RAM: 32.0 GB 입력값 MSVC++ v14.26 (초) Mingw-w64 v8.1.0 (초) 40 0.612 0.394 41 0.990 0.635 42 1.607 1.024 43 2.591 1.657 44 4.201 2.689 45 6.767 4.347 46 10.955 8.102 결론: 피보나치 수열에서는 Mingw-w64 v8.1.0이 MSVC++ v14.26보다 약 1.5배 더 빠름
12345678910111213141516171819202122232425262728293031323334353637383940414243class mutex_manager {public: mutex_manager(const int& channelIndex) : channelIndex(channelIndex), deviceAddr("0.0.0.0") {} mutex_manager(const int& channelIndex, const std::string& deviceAddr) : channelIndex(channelIndex), deviceAddr(deviceAddr) {} //INFO: 같은 스레드에서 잠금 시도시 무시하고, 다른 스레드에서 잠금 시도 시 대기 void get_mutex_lock(bo..
1234567891011121314151617181920212223242526#include #include #include using namespace std; std::string multibyte_to_utf8(const std::string& str) { int nLen = str.size(); wchar_t warr[256]; MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str.c_str(), -1, warr, 256); char carr[256]; memset(carr, '\0', sizeof(carr)); WideCharToMultiByte(CP_UTF8, 0, warr, -1, carr, 256, NULL, NULL); return carr;} std::string..
C++에서 printf() 함수를 사용하면 원하는 변수를 파라미터로 전달하여 원하는 포맷으로 문자열을 출력할 수 있다. string name = "Kim";printf("My name is %s", name.c_str()); 여기서 파라미터로 값을 전달하는 부분을 %d, %s와 같은 포맷 지정자 (format specifier)를 통해 타입과 위치를 지정할 수 있고, 쉼표를 통해 뒤에 파라미터를 전달해주면 된다. 문제는 포맷 지정자의 개수와 실제 전달하는 파라미터의 개수가 사용자의 실수로 얼마든지 달라질 수 있다는 점이다. string name = "Kim";printf("My name is %s and my hobby is %s\n", name.c_str()); // INFO: 프로세스 종료printf..