SW 그리고 아빠 엔지니어링 중...

아는 만큼 보이고, 경험해봐야 알 수 있고, 자꾸 써야 내 것이 된다.

C++ 35

perfect forwarding을 perfect하게 이해하기

🎯 지난 글에서 C++ 핵심 가이드라인에 'F.19: "전달(forward)" 매개변수는 TP&&타입과 std::forward로만 전달하라' 에 대한 설명이 빈약했는데, 본 글에서 perfect forwarding에 대해 알아보고, C++ 핵심 가이드라인의 의미도 이해해 보자. 💬 std::forward를 이해하려면 참조 축소 규칙을 우선 이해해야 한다. Reference Collapsing Rules(참조 축소 규칙) 💬 참조 축소 규칙을 설명하기 이전에 우선 아래 내용에 대해 생각해 보자. reference의 reference는 과연 컴파일이 될까? int main() { int x = 10; int& r = x; int& & rr = r; //reference의 reference 과연될까? retu..

L C++ 2024.03.29

std::string_view의 이해

SL.str.2: 문자들의 나열을 참조하기 위해서는 std::string_view나 gsl::string_span을 사용하라. 🤔 C++ Core Guidelines에 가이드이다. 왜 std::string_view를 써야 하는지 알아보자. 📢 std::string_view를 이해하기 위해 기존 개념부터 이해하고 넘어가야 할 것 같은데 알고 있는 내용은 다음 내용으로 넘어가도 좋다. 초기화 VS 대입 아래 예제코드의 초기화와 대입에 대해 우선 이해해 보자. //primitive type //1-1) int a = 0; //1-2) int b; b = 0; // user define type //2-1) std::string s1 = "hello"; //2-2) std::string s2; s2 = "hel..

L C++ 2024.03.19

modern C++ Concurrency 기술 공부를 위하여✔

Modern C++에 Concurrency 기술 공부를 얼추 끝냈다.(~C++20) Concurrency 기술을 공부하면서 느낀 것은 필요한 부분만 보면 잘 이해가 되지 않았던 점 같다. 그래서 스택처럼 이해를 쌓아가기 위해 포스팅을 시작했었고 전반적인 내용에 대한 정리가 끝이나 공부 순서를 목차로 정리하였으니 Concurrency 기술을 이해해보고자 하는 분들에게 도움이 되었으면 한다. Modern C++에 Concurrency 기술 study 목차 [Utilities] std::reference_wrapper (std::ref) : thread를 잘 사용하기 위해 필요한 템플릿 클래스 [Utilities] thread를 잘 사용하기 위한 std::reference_wrapper (std::ref) (..

L C++/Concurrency 2024.02.06

memory order 조정 이야기

프로그램 코드들은 기계어로 변환되어 메모리에 올라가고 fetch, decode, execute를 반복하며 수행이 된다. L fetch(명령어 가져오기) decode (명령어 해석하기) execute (명령어 실행기) 이때 메모리 순서라고 하는 것은 결국 CPU가 메모리에 있는 명령어를 읽는 순서를 말하는데 pc -> 0x0000 mov .... 0x0001 add .... 0x0002 mov .... *pc (프로그램 카운터) 이 순서가 컴파일 시 컴파일러에 의해 혹은 런타임 중에 CPU에 의해 조정될 수 있기에 이에 대해 알아보자. CPU에 의해 조정되는 메모리 순서아래 표에도 나와있지만 모든 CPU가 메모리 순서 조정을 지원하진 않는다. 전통적인 아키텍처인 X86과 AMD, 즉 당신의 PC는 메모리 ..

L C++/Concurrency 2024.01.30

[Concurrency] lock-free와 mutex사이 spin lock

2024.01.16 - [L C++] - [Concurrency] ❇ std::atomic ❇의 이해 이전 글에서는 lock-free 관점에서 쓰다 보니 spin lock은 쓰면 안 되는 것처럼 생각할 수 있는데 본 글에서 spin lock의 필요성에 대해 이야기하고자 한다. spin lock의 필요성 이해 context switching에 따른 오버헤드 발생 Context switching은 CPU가 현재 실행 중인 프로세스나 스레드를 중단하고 다른 프로세스나 스레드를 실행하는 작업을 말한다. 우선 아래 예제를 보자. 예제 1 두 개의 스레드가 공유 데이터를 호출하는데 공유 데이터 접근은 mutex로 처리한 프로그램 코드이다. #include #include #include #include std::m..

L C++/Concurrency 2024.01.23

[Concurrency] 동기화 기본 요소(synchronization primitive) 정리

각각의 동기화 기본 요소 리포팅이 완료되어 전체를 일괄 정리해 보자. 각각의 동기화 기본 요소(synchronization primitive)를 정리해 보면 다음과 같다. (각 요소의 세부 내용은 제목에 링크를 걸어 놨다.) Condition variables (C++11) 조건 변수는 여러 스레드가 서로 통신할 수 있도록 하는 동기화 기본 요소입니다. 이를 통해 일정 수의 스레드가 다른 스레드로부터 진행될 수 있다는 알림을 기다릴 수 있습니다(시간 초과 가능). 조건 변수는 항상 뮤텍스(Mutex)와 연결됩니다. Semaphores (c++20) 세마포어는 공유 리소스에 대한 동시 액세스를 제한하는 데 사용되는 경량 동기화 기본 요소입니다. 둘 중 하나라도 충분할 경우 세마포어는 조건 변수보다 더 효율..

L C++/Concurrency 2024.01.19

[Concurrency] ❇ std::atomic ❇의 이해

발행 : 2014/01/16 수정 : 2014/01/20 - atomic에 대한 전체 내용에 대한 링크 추가 - 메모리 오더 옵션에 대한 정보 추가 - gcc에서 is_lock_free 가 에러 나는 이유 추가 본 글을 atomic 중 lock free에 대해 중점적으로 설명한 내용입니다. (상세 설명은 제일 밑 참고에 링크를 추가하였습니다.) atomic의 사전적 의미 원자성(原子性, atomicity)은 어떤 것이 더 이상 쪼개질 수 없는 성질을 말한다. 어떤 것이 원자성을 가지고 있다면 원자적(atomic)이라고 한다. 생각해 봅시다. C++ 코드에서 원자적인 것은 어떤 것이 있을까요? 한 줄짜리 코드인 x++ 는 원자적일까요? 정답은 아니다. 한 줄짜리 x++을 기계어로 변환하면 아래와 같이 3개..

L C++/Concurrency 2024.01.16

[Concurrency] C++20 스레드 조정 메커니즘 std::latch와 std::barrier

C++20부터 latch and barrier 가 필요한 이유? 2023.11.28 - [L C++] - [Concurrency] std::jthread - join 없이 사용하기📌 C++ 20부터 join을 알아서 해주는 jthread가 생겼다. 하지만 기존 thread를 대체하기에는 아직 문제가 있는데 어떤 문제가 있는지 아래 의사코드(pseudocode)에서 확인해 보자. main() { std::thread() together_working() std::join() after_working() } : thread와 동시에 together_working이 실행되고, 스레드 종료 이후에 after_working이 실행되었던 것을 main() { std::jthread() together_working..

L C++/Concurrency 2024.01.09

[Concurrency] mutex의 lock/unlock 관리 도구 소개 (1/2)

이전 글에서 2023.12.19 - [L C++] - [Concurrency] 다양한 mutex 소개 deadlock 방지 사례와 성능 향상에 대한 mutex 소개가 있었는데 C++ Core guidelines에 보면 lock()/unlock()을 직접 사용하지 말라고 합니다. 😨 CP.20: Use RAII, never plain lock()/unlock() * RAII : Resource Acquisition Is Initialization. (자원의 획득은 초기화 과정이다. => 자원의 획득은 (자원관리 객체의) 초기화 과정이다. => 자원 관리는 항상 생성자/소멸자에 의존해라.) 왜? mutex 사용 시 RAII를 쓰라고 하는 이유에 대해 함께 알아봅시다. mutex 사용 시 RAII를 쓰라고 하..

L C++/Concurrency 2023.12.29

[Concurrency] 다양한 mutex 소개

C++ mutex는 몇 개 알고 계신가요? C++ mutex는 6개이다. 아래 글에서 mutex를 다뤘으니 볼드체로 된 3 가지만 알아볼 텐데, (나머지 2개는 조합이니 관심 있는 분은 개별로 알아보세요.) 이 mutex 들을 통해 아래 이슈에 대한 해결이 가능하게 된다. 1. lock 중에 lock을 호출하여 deadlock이 발생하는 문제 해결 방법은? 2. 공유데이터를 읽을 때 속도를 향상 시키는 방법은? 3. 한정된 시간에 lock에 예외를 발생시키는 방법은? mutex(C++11), recursive_mutex(C++11), shared_mutex(C++17) timed_mutex(C++11), recursive_timed_mutex(C++11), shared_timed_mutex(C++14) ..

L C++/Concurrency 2023.12.19
320x100