블로그
-
C++ mutex: 경쟁 상태, 데드락, lock_guard·scoped_lock 사용 원칙
주문 수가 맞지 않는 카운터 버그로 race condition과 data race를 구분하고, 재고 감소나 작업 큐 중복 처리 같은 사례를 mutex로 고칩니다. lock_guard와 unique_lock 선택 기준, 락 순서 통일과 std::lock, scoped_lock으로 데드락을 피하는 법도 설명합니다.
-
C++ condition_variable로 작업 큐 만들기: 허위 깨움 처리와 스레드 풀
작업 큐를 폴링하며 CPU를 낭비하던 구조를 condition_variable로 바꿔 작업이 들어올 때만 스레드를 깨우는 방법을 설명합니다. predicate를 넣은 wait로 허위 깨움을 처리하는 법, 스레드 안전 큐와 스레드 풀 구현, lock_guard를 쓰면 안 되는 이유를 다룹니다.
-
C++ atomic: 락 없는 카운터, 메모리 순서, 언제 mutex 대신 쓰나
카운터 하나에 mutex를 쓰기 부담스러울 때 std::atomic의 fetch_add와 compare_exchange로 락 없이 갱신하는 방법, seq_cst, acquire/release, relaxed 메모리 순서를 고르는 기준, 스핀락과 플래그 같은 활용 패턴, ABA 문제와 volatile 혼동을 설명합니다.
-
C++ 스택 vs 힙 | 재귀에서 프로그램이 죽는 이유와 스택 오버플로우 사례
깊은 재귀로 프로그램이 갑자기 죽는 사례에서 출발해 스택과 힙이 메모리에서 어떻게 다르게 동작하는지, 힙 할당이 느린 이유, delete와 delete[]를 헷갈리는 실수, 언제 스택을 쓰고 언제 힙에 할당할지 판단하는 기준을 예제로 설명합니다.
-
C++ 메모리 누수: 흔한 5가지 패턴과 Valgrind·ASan으로 찾는 방법
early return으로 delete를 건너뛰는 서버 코드를 출발점으로 이중 삭제, 댕글링 포인터, 누수, delete와 delete[] 혼동, 예외 안전성 무시 5가지 패턴을 재현하고, Valgrind와 AddressSanitizer가 각각 무엇을 어떻게 보고하는지 보여줍니다.
-
C++ 스마트 포인터 | unique_ptr·shared_ptr·weak_ptr와 순환 참조 끊기
Valgrind는 누수가 없다는데 메모리가 계속 늘어나는 shared_ptr 순환 참조를 출발점으로, unique_ptr의 소유권 이전과 커스텀 삭제자, shared_ptr의 참조 카운팅 구조와 비용, weak_ptr로 순환을 끊는 법과 상황별 선택 기준을 다룹니다.
-
C++ RAII: 생성자에서 획득하고 소멸자에서 해제하는 자원 관리 클래스 만들기
early return 때문에 파일 핸들이 새는 코드에서 시작해, 생성자에서 획득하고 소멸자에서 해제하는 RAII로 파일, 뮤텍스, 소켓, DB 트랜잭션을 관리하는 클래스를 직접 만들고 복사와 이동 규칙을 정하는 방법을 보여줍니다.
-
C++ 컴파일러 비교 | GCC vs Clang vs MSVC, 어떤 걸 써야 할까?
전처리, 구문 분석, 최적화, 코드 생성 단계를 직접 실습하며 같은 코드가 컴파일러마다 다르게 빌드되는 이유를 살펴보고, GCC의 -O2와 -O3 선택, Clang의 친절한 에러 메시지와 정적 분석, MSVC의 특징을 비교해 프로젝트에 맞는 컴파일러를 고릅니다.
-
PGO·LTO로 C++ 컴파일러 최적화하기: -O2 vs -O3 차이와 측정법
-O2와 -O3가 실제로 무엇을 다르게 하는지, LTO(Full·Thin)로 파일 경계를 넘는 인라인을 켜는 법, PGO의 계측→실행→재컴파일 3단계를 GCC·Clang·MSVC 옵션별로 설명하고 -march=native로 인한 SIGILL 같은 배포 함정도 다룹니다.
-
C++ 멀티 컴파일러 전략과 CI/CD 파이프라인 구축 | 실무 가이드
내 PC에서는 되는데 다른 환경에서 깨지는 빌드를 막기 위해 GCC, Clang, MSVC를 함께 쓰는 전략을 다룹니다. 경고를 에러로 올리는 옵션, 컴파일러 감지 매크로와 플랫폼 차이 처리, GitHub Actions 빌드 매트릭스와 CMake Presets 구성까지 예제로 보여줍니다.