본문 바로가기

c++26

C++ 뮤텍스 이중 lock 호출 문제 해결방안 [개요] C++로 작성된 회사 프로젝트에서 Onvif를 연동한 소스코드가 있는데, profileMutex, streamMutex 등의 뮤텍스를 사용하여 PTZ와 Onvif SDK를 사용하였다. 위의 각 PTZ 함수들이 모두 profileMutex를 잠근 후 사용하고 있는데, 문제는 뮤텍스를 사용하는 함수에서 또 뮤텍스를 사용하는 다른 함수를 호출하는 경우가 존재한다. 위 함수는 SetPreset() 함수인데, 처음에 profileMutex를 잠근 후에 아래에서 RemovePreset()을 호출하고, 다음에는 GetPresets()를 호출하고 있다. 이 코드는 그나마 리팩토링이 되어서 이중락이 발생하지 않도록 수정되었으나, 다른 함수들에서도 이런 경우가 발생할 여지가 높아보이도록 코드가 작성되었다. [개선.. 2021. 6. 7.
C++ vs Node.js vs Go - 멀티스레드 퀵정렬 수행속도 비교 [실험환경] CPU : AMD Ryzen 7 1700 8-Core Processor Memory : 32.0 GB OS : Windows 10 Pro 데이터 개수 : 2천만개 ~ 3억 2천만개 스레드 개수 : 16개 값의 범위 : 0 ~ 1,000,000,000 [분석] 데이터 개수가 적을 때는 Node.js 가 가장 느린 성능을 보여주었으며, 데이터 개수가 증가함에 따라 Node.js가 Go를 제치고 더 빠른 성능을 보여주었다. Node.js는 멀티스레드를 사용하기 위해 worker_thread를 사용하는데, 각 스레드들이 수행할 작업이 적힌 스크립트 파일 (js)을 읽어서 수행하기 때문에 초반에 지연이 걸리게 되었다. 모든 경우에서 C++가 가장 빠른 속도를 보여주었다. 데이터 개수가 1억 6천만개 .. 2021. 6. 7.
백준 알고리즘 21738 얼음깨기 펭귄 C++ 코드 백준 알고리즘 링크 남극에 펭귄 한 마리와 크기와 모양이 동일한 N 개의 얼음 블록이 있습니다. 펭귄은 N개의 얼음 블록 중 한 곳 위에 서 있습니다. 펭귄이 서있는 얼음 블록 (이하 블록)을 기준으로 다른 블록들이 연결되어 있으며, 각 블록으로 이동할 수 있는 경로는 한 가지만 존재합니다. N개의 얼음 블록 중 M 개의 블록은 지지대 블록으로, 일반 블록들이 무너지지 않도록 지탱해주는 역할을 합니다. 일반 블록들은 지지대 블록이 하나라도 연결되어 있으면 무너지지 않습니다. 또한, 지지대 블록들 사이에 이동을 위해서는 반드시 펭귄이 서있는 블록 (이하 루트 블록)을 거쳐야 합니다. 또한, 루트 블록이 무너지지 않기 위해서는 지지대 블록이 반드시 두개 이상 연결되어 있어야 합니다. 또한, 루트 블록이 무너.. 2021. 6. 7.
Node.js와 C++의 퀵정렬 속도 비교 (+메모리 할당 개선) 재귀 없는 퀵정렬을 JS와 C++로 구현하면서 수행속도를 측정하고자 하였다. C++은 정수형 타입이더라도 1바이트, 2바이트, 4바이트, 8바이트로 개발자가 선택하여 사용해야 하는 반면, JS는 정수형과 실수형 타입 모두 number로 사용되고 있다. 다만, JS의 경우 ArrayBuffer를 통해 원하는 바이트 크기의 버퍼를 생성할 수 있고, Int32Array() 함수로 해당 버퍼를 래핑하여 배열 원소의 크기를 4바이트로 사용할 수 있다. [기본 배열 사용시] JS에서 1억개 할당 시 기본 배열은 최대 6.8GB의 메모리 공간을 차지하였다. 정렬 시 시간은 13.452초 소요되었다. 메모리 할당 시간은 36.656초 소요되었다. [고정 크기 배열 사용시] JS에서 1억개 할당 시 고정 크기 배열은 4.. 2021. 6. 7.
윈도우 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"을 클릭하여 .. 2021. 2. 23.
멀티스레드 환경에서 합병정렬을 통한 C++과 Go언어 성능비교 [테스트 환경] *운영체제 : 윈도우 10 프로 (1903 버전) *CPU : AMD Ryzen 7 1700 8-core *RAM : 32 GB *C++ 컴파일러 : MinGW 8.1.0 64-bit *Go 컴파일러 : 1.13.5 *데이터 최대값 : 100,000,000 *연산 : 멀티스레드 기반의 합병정렬 [데이터 변수] *스레드 개수 : 1, 2, 4, 8, 16, 32, 64 → 데이터 개수 100,000,000 개 고정 *데이터 개수 : 20,000,000, 40,000,000, 60,000,000, 80,000,000, 100,000,000 → 스레드 개수 16 개 고정 [결과] 스레드 개수 1 2 4 8 16 32 64 C++ 16.8536 8.8936 5.017 3.366 2.79 2.71.. 2020. 7. 27.
[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배 더 빠름 2020. 7. 13.
프로그래밍 언어 별 성능 측정 원본에서 더 깔끔합니다. [알고리즘] 비교 알고리즘: 피보나치 수열 반복횟수: 5회 피보나치 값: 38 [C++] (MSVC, 최적화 안함) #include #include "HourMeter.h" using namespace std; int fibonacci(const int value) { if (value == 0 || value == 1) { return 1; } return fibonacci(value - 1) + fibonacci(value - 2); }; void main() { HourMeter hm; int fibValue{ 38 }; for(int i=0;i> Java > Golang > C# >파이어폭스> Node.js > 크롬 > 엣지 > LuaJIT > Rust >>>>> Pyth.. 2020. 7. 4.
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.. 2020. 6. 24.