반응형

Engineering/C++ 8

Chapter 4. Synchronizing Concurrent Operations. (3) - Functional Programming

Functional Programming 함수형 프로그래밍을 한 줄로 요약하자면 pure function을 first class object로 보는 것이다. 이를 통해 데이터와 로직을 분리한다. pure function이란 함수 밖에 영역에 영향을 끼치지 않으며, input이 같으면 언제나 output이 같은 함수를 뜻 한다. 이를 first class object로 본다는 것은 함수를 parameter처럼 주고받을 수 있게 만들었단 뜻이다. 즉, 고차함수(Higher order function)를 만들거나 콜백(callback)을 구현할 수 있다.함수형 로직으로 프로그래밍을 설계하면 쉽게 병렬 프로그램을 짤 수 있다. 요즘 나온 언어(rust, clojure)는 함수형 프로그래밍을 염두해 두고 만들었다..

Engineering/C++ 2025.01.26

Chapter 4. Synchronizing Concurrent Operations. (2) - future

1. Future vs Shared Future뮤택스(Mutualy Exclusive)는 Race Condition(경쟁 상태)을 방지하기 위해서 공유 자원에 접근을 하나로 제한하는 것이었다.Conditional Variable(조건 변수)는 스레드 간의 순서를 맞출 때 사용했다. (Synchronizing)future 멀티 스레드에서 결과 값을 받아 올 때 쓰는 class이다. future 자체로는 Race Condition을 막을 수 없다. 그래서 Read only 함수만을 이용하면 더 편리한 멀티 스레딩이 된다. 만약 여러 개의 함수가 Read only로 결과를 내서 합친다면 shared_future를 사용할 수 있다. future는 movable 하지만 shared_future는 movable과..

Engineering/C++ 2025.01.22

Chapter3. Sharing Data Between Threads

해당 챕터는 Thread 간 데이터를 공유하는 방법에 관해 다룬다. Race Condition (경쟁 상태)란 여러 개의 Thread가 같은 데이터에 한 번에 접근해서 생기는 문제점이다. 데이터를 읽고 쓰기를 동시에 할 때 일어난다. 실행할 때마다 결과가 다르게 나오는 거지 같은 상황이 나올 수 있다.1. Race Condition해결 방법Mutex 기반Critical Section에 접근할 수 있는 Thread를 제한한다. C++에서 가장 많이 쓰는 방법이다.Lock-Free Programming자료구조를 바꿔서, 여러 과정을 통해 자료구조의 부분이 변하게 한다. (Chapter5. Memory Model, Chapter 7 Lock-Free Data structure)Update를 Data Trans..

Engineering/C++ 2025.01.20

Chapter 4. Synchronizing Concurrent Operations

스레드를 순서대로 동기화시키는 방법에 관해 다룬다.4. Waiting for Event or Other Condition하나의 thread가 끝낼 때 까지 다음 thread가 기다리는 것은 conditional varaible로 쉽게 가능하다.4.1 Waiting for a Condition with Conditional Variablebusy wait 방식 (+ sleep_for )만약 conditional variable이 없다면 busy waiting 방식을 사용해야 한다. CPU 자원도 낭비되고, 기다려야 하는 초를 계산하기 힘들다.bool flag; std::mutex m; void waitForFlag(){ std::unique_lock lk(m); while(!flag){ lk.unlock..

Engineering/C++ 2025.01.18

C++ STL 정리

STL은 4가지 분류로 나뉜다.ContainersAlgorithms numeric: 난수 생성 + 최적화된 array들을 기반한 알고리즘 algorithm: [begin, end) 기반으로 range 있는 container에 쓰는 알고리즘 IteratorsFunctors0. itoaC의 memset의 c++ version이다.수학적에서 관용적으로 쓰이던 표현이다. set of number 혹은 unit vector 쓴다. 그리스어로 짧은 문자이다.templatevoid iota( ForwardIt first, ForwardIt last, T value ); // (constexpr since C++20)https://en.cppreference.com/w/cpp/algorithm/iota1. copy_n..

Engineering/C++ 2024.12.19

C++17 Class Template Argument Deduction (CTAD)

C++ 17부터는 Class Template Argument Deduction이 적용된다. 말 그대로 template argument가 생략될 수 있다는 뜻이다.적용되는 분야는 다음과 같다.template으로 선언 돼 있는 변수를 초기화 할 때 (possibly cv-qualified):std::pair p{2,2.3}; // pairstd::tuple tp{"kor",2,'a'}; // std::make tuple new 표현식templatestruct A{ A(T, T);};auto y = new A{1, 2}; // allocated type is A함수 호출auto lck = std::lock_guard(mtx); // deduces to std::lock_guardstd::copy_..

Engineering/C++ 2024.12.19

C++에서 auto vs decltype vs typeid

C++를 하다 보면 타입이 맞지 않아 에러가 나는 경우가 많다. 이때마다 python의 type(class)이 부러워진다. 한편으론 생각 없이 auto와 decltype을 남발하면 되는 것이 아닌지 의구심이 든다. 하지만 C++의 장점은 이 타입을 강력하게 지켜준다는 것이다. 이 때문에 런타임에 발생할 에러를 미리 잡을 수 있고, 성능도 빨라진다.해당 포스트의 목표는 C++의 타입을 알 수 있는 세가지 방법, auto, decltype, typeid를 비교하는 것이다.1. auto와 decltype이들은 C++11에 추가된 기능이며, 근본은 generic programming에 근간을 두고 있다. template과 원리가 똑같다. 즉, user가 준 type에 맞춰서 코드를 생성해 준다. generic ..

Engineering/C++ 2024.06.10

C++에서 다양한 타입을 벡터 혹은 배열에 저장하는 법

역전파 코드를 개발 과정에서 문제점을 발견했다. 다른 class(type)의 레이어들을 어떻게 순서대로 방문할 것인가?  반복문을 쓰고 싶지만, vector나 array는 같은 타입의 묶음만 정의가 가능하다. 만약 이들을 순서대로 방문해 주는 자료형이 없다면 아래와 같이 하나씩 방문했을 것이다.// https://github.com/luckydipper/MNIST_DEEP_LEARNING_CLASSIFIERint main(){ neural::Linear l1{flatten_img_size, in_out_size[0]}, l2{in_out_size[0], in_out_size[1]}, l3{in_out_size[1], in_out_size[2]}, l4{in_out_size[2], in..

Engineering/C++ 2024.06.04
반응형