C++/Effective Modern C++
-
[Effective Modern C++] insert와 emplaceC++/Effective Modern C++ 2023. 6. 13. 16:07
C++의 여러 컨테이너는 여러 종류의 삽입 함수를 지원합니다. 컨테이너의 종류에 따라 다르지만, 대부분 push혹은 insert라는 이름을 취하고 있습니다. 이러한 컨테이너에 자료를 삽입하는 경우를 생각해보도록 하겠습니다. std::vector vec; vec.push_back("asdf"); 위 코드의 push_back부분을 자세히 들여다보도록 하겠습니다. 위 삽입 과정은 다음과 같이 진행됩니다. 삽입하는 인자 "asdf"로부터 임시 std::string 객체가 생성됩니다. 이 객체에는 이름이 없지만, 지금은 temp라고 명명하도록 하겠습니다. temp가 push_back에 전달 R-value reference로 전달됩니다. 전달된 R-value reference를 통해 std::string 객체가 생..
-
[Effective Modern C++] 값 전달을 고려할만한 상황C++/Effective Modern C++ 2023. 6. 9. 14:04
값 전달(Pass by value)은 C++에서 기피되는 방식입니다. 전달 과정에서 이미 복사(이동)연산이 추가적으로 발생하며, 그 외에도 일어날 수 있는 추가적인 문제가 있기 때문입니다. 이에 권장되는 전달 방식은 참조 전달(Pass by reference)입니다. 하지만, 이번 글에서는 그럼에도 불구하고 값 전달을 고려할 수 있는 경우를 살펴볼 것 입니다. 이번 글에서 살펴 볼 예제 코드의 시나리오는 다음과 같습니다. MyClass라는 클래스 내의 멤버 함수를 다룹니다. 이 함수는 문자열을 받아서 자신의 문자열 배열 멤버 변수에 저장합니다. 위 내용의, 멤버 함수를 제외한 클래스 구현은 다음과 같습니다. class MyClass { public: // Function private: std::vect..
-
[Effective Modern C++] std::atomic VS volatileC++/Effective Modern C++ 2023. 5. 12. 18:32
volatile과 std::atomic은 서로 다른 기능을 하는 도구입니다. 그러나 두 도구 모두 변수에 특정 속성을 부여하고, 최적화, 동기화와 관련된 도구이다보니 그 사용처가 혼동되고는 합니다. 이번 글에서는 두 도구의 차이를 중점적으로 살펴보도록 하겠습니다. 1. RMW(Read-Modify-Write) operation 더보기 다음 예제를 보도록 하겠습니다. std::atomic ai(0); // ai = 0 ai = 10; // ai = 10 ++ai; // ai = 11 --ai; // ai = 10 위 코드의 std::atomic객체 ai에 대한 연산에 대하여, 관측 가능한 ai의 값은 주석과 동일한 0, 10, 11입니다. std::atmoic객체는 객체에 대한 연산을 원자적으로 (더 이상..
-
[Effective Modern C++] 스레드 간 단발성 이벤트 통신C++/Effective Modern C++ 2023. 5. 4. 15:59
프로그램의 이벤트를 분류하는 방법으로, 이벤트의 반복성을 들 수 있습니다. 프로그램 전반에 걸쳐서 주기적으로 발생하는 이벤트가 있는가 하면, 한 번 발생 이후 소멸하는 이벤트가 있습니다. 단발성 이벤트 경우, 대부분 이벤트의 발생 조건이 되는 트리거가 있습니다. 프로그램의 구조 상, 이벤트는 발생 조건이 되는 트리거의 감지와, 이후 실행하는 작업을 분리하는 것이 유용한 경우가 있습니다. 예를 들면 자료구조의 초기화, 계산 과정 중 특정 단계의 완료, 센서 임계값 감지 등이 있을 수 있습니다. 이번 글에서는 위와 같은 단발성 이벤트가 이벤트의 감지와 실행이라는 두 이벤트로 분리되어 있다고 할 때, 해당 이벤트들의 통신 방법에 대하여 살펴보도록 하겠습니다. 이번 글에서는, 이벤트의 트리거를 감지하는 과제를 ..
-
[Effective Modern C++] std::future의 소멸자C++/Effective Modern C++ 2023. 4. 19. 15:24
std::thread인스턴스는 소멸자 호출 시, 인스턴스의 join여부에 따라 행동이 갈라집니다. 이에 대한 자세한 내용은 이전 글 (std::thread를 unjoinable하게 만들어야 하는 이유)에 서술되어 있습니다. joinable한 std::thread인스턴스의 소멸자가 호출되면 프로그램이 종료되며, 이는 이것이 가장 최선의 대응이기 때문이라는 내용이었습니다. 이번 글은 std::thread외에 동시성 프로그래밍에 사용되는 std::future객체의 소멸자에 대하여 살펴보도록 하겠습니다. 1. std::future의 결과 저장 더보기 std::future객체는 피호출자 (std::future객체)가 호출자(std::async등의 함수를 지정하는 코드)에게 결과를 전송하는 통신 채널이라고 볼 수 ..
-
[Effective Modern C++] std::thread를 unjoinable하게 만들어야 하는 이유C++/Effective Modern C++ 2023. 4. 14. 15:25
std::thread객체는 현재 상태에 따라 두 종류로 구분이 가능합니다. Joinable : 실행 중(Running)이거나, 실행 중 상태로 전이할 수 있는 스레드입니다. Unjoinable : Joinable하지 않은 스레드입니다. Unjoinable상태는 다음과 같은 경우가 있습니다. 기본 생성된 std::thread는 실행할 함수가 없기 때문에 joinable하지 않습니다. std::thread는 복사할 수 없는 객체이기 때문에, 이동 후 원본 std::thread는 joinable하지 않습니다. join 및 detach된 std::thread는 joinable하지 않습니다. std::thread의 joinable 상태를 면밀히 점검하는 것은 매우 중요합니다. 이번 글에서는 std::thread의..
-
[Effective Modern C++] std::async의 launch policy (std::launch)C++/Effective Modern C++ 2023. 3. 28. 14:33
지난 글 (std::thread와 std::async)에서 동시성 프로그래밍을 위해 사용되는 두 기능을 살펴보았습니다. 몇몇 예외 상황을 제외하고, 여러 편의성을 이유로 std::async가 더 좋다는 내용이었습니다. 지난 글의 예제에서는 std::async를 다음과 같이 호출했습니다. auto fut = std::async(function); 하지만 이런 호출에 대하여, function함수가 비동기적으로 바로 실행된다는 보장이 없습니다. 이번 글에서는 std::async의 작동 방식에 대하여 살펴보도록 하겠습니다. 1. std::launch 더보기 std::async는 의미론적으로는 지정 객체를 비동기적으로 호출하는 의미이지만, 실제로는 그렇지 않습니다. std::async는 특정한 실행 방침 (lau..