[C++] enum 과 enum class

Enum vs enum class모던 C++ 이전에는 enum만 사용했었다. enum PlatformType { DRONE, VEHICLE};enum WeaponType { MISSILE, VEHICLE // 🚨 위에서 쓴 VEHICLE이랑 이름이 똑같다-> 컴파일 에러 발생!};이렇게 enum에서 같은 VEHICLE이 생기면 에러가 발생했다. 이름이 중복되었다며. 예전 enum 같은 경우는 또 int로 적용되었기 때문에 DRONE==0 , VEHICLE==1 이런식.PlateformType::DRONE== WeaponType::MISSLE 되는 문제가 있다. c++11 enum class 로 사용하게 되면 enum class PlatformType { DRONE, V..

[C++] 예외처리 - optional / error_code/ sentinel value

요약C++ 에서 예외 처리 하는 방식은 크게 2가지가 있다. 예외(exception) 방식 : throw/ try/ catch 에러 코드 방식: optional , error_code, sentinel Value 1. 예외 방식의 문제점언제 던져질지 예측 불가 → 실시간성 깨짐 (정해진 시간 안에 끝나야 하는데 예외 처리에 얼마나 걸릴지 모름)메모리 오버헤드 → 예외 처리에 추가 데이터가 필요컴파일러가 다 비활성화 가능 → -fno-exceptions 옵션으로그래서 방산/항공 표준 규격(MISRA C++ 등) 문서 첫 페이지를 보면 "컴파일 옵션에서 예외 처리 기능(-fno-exceptions)을 완전히 끄고 개발하라"고 아예 못을 박아두기도 한다. 2. 예외 이외 오류를 알리는 방식 센티넬 값(Se..

[C++] 멀티쓰레딩 -5. Deadlock, scoped_lock

Deadlock 은 두 쓰레드가 서로 Lock 을 기다리면서 멈춰있는 무한 루프 상태를 말한다. Thread A, B에서 mtx1과 mtx2 가 있어야 작업 가능한 경우 무한 대기 발생하게 된다. Thread A: mtx 1 잡음 -> mtx2 잡기위한 대기 Thread B : mtx 2 잡음 -> mtx 1 잡기 위한 대기 모던 c++에서는 lock 두가지를 한번에 잡는 scoped_lock 을 사용할 수 있다. //예전 방식 std::lock(mtx1, mtx2); std::lock_gaurd lk1(mtx1, std::adopt_lock);std::lock_gaurd lk2(mtx2,atd::adpot_lock);//c++17std::scoped_lock lk(mtx1, mtx2); //동시에 mt..

[C++] 멀티쓰레딩 - 4. SafeQueue

SafeQueue란? 실무 프로그램은 대게 두 분류로 나뉜다. 1. 데이터를 만드는 생산자( 네트워크 패킷 수신 쓰레드, 센서 데이터 수집 스레드) 2. 데이터를 처리하는 소비자( 그래픽 렌더링 쓰레드 , 데이터베이스 저장 스레드) 하지만 C++ std::queue는 멀티스레드 환경에서 여러 스레드가 동시에 데이터를 사용하게 되면 프로그램이 터지게 된다. 따라서 mutex와 condition variable로 꽁꽁 싸서 만든 SafeQueue가 멀티 스레드 프로그램의 뼈대가 된다.Safe Queue의 구성 SafeQueuequeue를 template 로 만들어서 다양한 타입의 데이터를 받을 수 있는 큐를 생성한다. mutable 키워드 : mutex 와 같은 작업 수행시 변수 상태를 바꿀 수 있도록 사용..

[C++] 멀티 쓰레딩 - 3. lock_guard vs unique_lock / atomic

Lock_guard 와 Unique_Lock 둘다 mutex를 RAII로 감싸주는 도구이다. //lock_Gard는 단순 만ㄷ르어 잠그고, 사라지면 Lock 풀림.std::lock_guard lk(m); //unique lock 은 보다 유연하게 수동으로 다시 풀고 잠금.std::unique_lock lk(m);lk.unlock();lk.lock();lock_gard: 단순히 잠갔다 여는 용도 . 숫자 하나 올리고 끝나는 경우 unique_lock: 명령에 따라 lock unlock 하는 경우. std::atomic - Lock 없이 안전한 연산lock 없이도 빠르게 쪼갤 수 없는 연산으로 처리함. cpu가 하드웨어 수준에서 읽고 -> ㄷ더하고 -> 쓰고 를 하는 연산.Mutex 보다 속도 빠름. 간단한..

[C++] 멀티 쓰레딩 - 2. Mutex

왜 Mutex가 필요할까? int shared = 0; // 두 쓰레드가 ++shared 하게 되는 경우. std::mutex 사용하는법. std::lock_gard lk(safeMtx); 뮤텍스 타입의 lock 선언.lk 가 lock_gard 의 이름. lock gard 는 자물쇠 열고 잠금. thread 마다 만들음. safeMtx : 뮤텍스 객체. 자물쇠 이름.지켜야할 자원마다 1개만 만들음. #include #include #include #include int shared=0;//자물쇠 객체 선언.std::mutex safeMtx; int main(){ //람다 함수 . auto safeInc = [&](){ for (int i =0 ; i lk(safeMtx); /..