반응형

컴퓨터 공학/C++ 31

C++ 뮤텍스 이중 lock 호출 문제 해결방안

[개요] C++로 작성된 회사 프로젝트에서 Onvif를 연동한 소스코드가 있는데, profileMutex, streamMutex 등의 뮤텍스를 사용하여 PTZ와 Onvif SDK를 사용하였다. 위의 각 PTZ 함수들이 모두 profileMutex를 잠근 후 사용하고 있는데, 문제는 뮤텍스를 사용하는 함수에서 또 뮤텍스를 사용하는 다른 함수를 호출하는 경우가 존재한다. 위 함수는 SetPreset() 함수인데, 처음에 profileMutex를 잠근 후에 아래에서 RemovePreset()을 호출하고, 다음에는 GetPresets()를 호출하고 있다. 이 코드는 그나마 리팩토링이 되어서 이중락이 발생하지 않도록 수정되었으나, 다른 함수들에서도 이런 경우가 발생할 여지가 높아보이도록 코드가 작성되었다. [개선..

윈도우 10 + Visual Studio 2017에서 C++ Boost 1.59.0 버전 설치하기

[개발환경] 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"을 클릭하여 ..

[C++] MSVC++ v14.26와 Mingw-w64 v8.1.0의 성능 측정

두 컴파일러 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배 더 빠름

Boost 기반 뮤텍스 안전하게 사용하도록 하는 코드

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..

C++ Printf 검사 프로그램

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..

CentOS 7에서 GCC 8 설치하는 법

[문제 소개] 현재 회사에서 C++ 기반의 제품을 개발하여 출시하였는데, 프로젝트가 약 5년 전에 시작된 제품이다 보니 C++11 기반으로 작업이 진행되고 있었습니다. 이 제품은 Windows와 CentOS를 대상으로 개발되었습니다. 이후 회사에서 Visual Studio 2015를 사용하게 되면서 Windows에서는 자연스럽게 C++14를 사용하였지만, CentOS는 그대로 C++11를 사용하고 있었습니다. 이때 사용한 GCC 버전이 4.8.5 였는데, 이 버전은 C++11까지만 정식으로 지원하고 있었습니다. 이에 따라, Windows와 CentOS의 C++ 버전이 지금까지 계속 다른 상태로 개발이 되었는데, 최근에 이로 인한 이슈가 적잖이 발견되어 CentOS의 C++ 버전을 14로 변경할 필요성을 ..

[C++] NativeMessaging으로 크롬 확장 앱과 C/C++ 앱 통신하기

크롬 브라우저에서 크롬 확장 앱을 사용하면 로컬에 있는 C/C++ 기반의 앱과 통신을 할 수 있습니다. ​ [준비물] * 크롬 브라우저 * Visual Studio (버전 무관) 첨부 파일로 올린 'chrome_extension_sample.7z'을 내려받아 압축을 해제합니다. 그림과 같이 메뉴 - 도구 더보기 - 확장 프로그램을 클릭합니다. 우측 상단에 개발자 모드를 on으로 설정합니다. 좌측 상단에 '압축해제된 확장 프로그램을 로드합니다.'를 클릭합니다. 그리고 위에서 내려받은 압축파일에 있는 app 폴더를 선택해줍니다. 그럼 다음과 같이 'Chrome 앱'에 확장 프로그램이 추가된 것을 확인할 수 있습니다. 다시 크롬 브라우저의 새창을 열어서 url 입력창에 chrome://apps/ 을 입력하여 ..

[C++] vector 컨테이너 반복문 종류별 성능

vector 컨테이너에 대한 반복문을 수행하는 방법은 1) 범위 기반 for 문, 2) 인덱스 접근 for 문, 3) 데이터 배열 취득 후 인덱스 접근 for문, 4) 반복자 사용 for 문 있다. 각각의 방식에 대한 성능이 궁금해져서 각 방식에 대한 성능을 측정해보기로 하였다. 데이터 크기만큼 int형 원소를 갖는 vector를 생성한 후 각 방식대로 반복문을 수행하면서 각 원소에 1이라는 값을 대입하였다. 데이터 크기를 1024, 2048, 4096, ..., 16777216 과 같이 1024부터 두 배씩 증가하여 각 방식의 성능을 측정하였며, 이 작업을 열 번 반복하여 평균을 내었다. ​ 소스코드는 다음과 같다. #include #include #include #include #include #in..

반응형