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

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

L C++ 47

[Concurrency] packaged_task - 기존 함수 그대로 thread에 적용(1)

(return이 있는) 기존 함수를 수정 없이 thread로 사용하기😆 기존 함수를 thread로 실행시킬 때, return이 없는(void) 함수는 수정 없이 thread로 분리가 가능하지만 (아래 글 참조) 2023.07.24 - [L C++] - [Thread] 인자와 callable object return이 있는 함수는 인자를 추가해야만 out parameter를 통해 return 값을 전달받을 수 있다. (아래글 참고) Promise / Future 모델 사용 방법 하지만 std::packaged_task와 std::async를 이용하면 기존 함수를 수정 없이 thread로 실행이 가능하기에 본 글에서는 packaged_task에 대해 알아보자. std::packaged_task 란?🤔 cal..

L C++/Concurrency 2023.11.14

[Concurrency] Future✨에 대해 더 알아보자.

Future the # 2023.10.25 - [언어/C++] - [thread] Promise /Future 모델 필요성 및 사용 방법 2023.10.31 - [언어/C++] - [thread] Promise /Future 모델 적용 이전 글에서 Promise / Future 모델 사용법과 기존코드에 Poromise / Future를 적용시키는 내용을 소개했었는데 이번 글에서는 Future의 세부 기능을 소개하고자 한다. Promise / Future 모델을 써도 연산이 종료되지 않아 무한대기하는 상황에서는 어떻게 해야 할까?🤔 이를 위해 Future 클래스에서 이런 문제를 해결하기 위한 기능을 제공하고 있다. 우선 멤버 함수를 확인해 보자. Future의 멤버 함수 share shared_future..

L C++/Concurrency 2023.11.07

[Concurrency] Promise /Future 모델 적용

이전 글에서 Promise / Future 모델 사용법을 알아봤는데 이번 글에서는 기존 코드에서 promise /future를 적용시키는 내용을 소개하고자 한다. 2023.10.25 - [언어/C++] - [thread] Promise /Future 모델 필요성 및 사용 방법 Promise / Future 모델 적용 전 아래 예제는 promise /future를 적용하기 전 sample코드이다. 아래 코드에 step1~4를 보고 스레드로 분리 가능한 부분을 찾아보자. 예제 1 아래 예제는 v1 vector 요소들의 부분 합을 v2에 적재하고, 적재된 v2 출력 및 v2 요소의 합을 출력하는 프로그램이다. #include #include #include #include #include int main() ..

L C++/Concurrency 2023.10.31

[Concurrency] Promise /Future 모델 필요성 및 사용 방법

Promise / Future 모델의 필요성 이전 글에서 기존 함수를 thread로 대체하는 방법을 알아봤었는데 일반 함수는 보통 리턴 값으로 결과를 반환하지만 스레드는 return을 지원하지 않기에(주 스레드(메인 스레드)로 결과 값을 전달할 수 없기에) out parameter를 사용했었다. 2023.07.24 - [언어/C++] - [Thread] 인자와 callable object 새로운 스레드로 실행이 되긴 했지만 결국 연산이 종료되어도 새로운 스레드가 종료되기 전까지 기다려야 하는 응답대기 시간이 발생하는데 이를 해결하기 위한 promise /future 모델을 사용해 보자. 예제 1 아래 예제는 2개의 값을 받아 합산한 결과를 리턴하는 add2() 함수를 스레드로 실행시켜 그 결과 값을 's..

L C++/Concurrency 2023.10.25

[Concurrency] Semaphore in C++20

2023.09.26 - [언어/C++] - [thread] race condition 예방 방법 : Mutex와 Semaphore 이전 글에 Binary Semaphores 예제는 semaphore.h에 세마포어를 사용했는데 c++20부터 지원되는 를 이용해서 세마포어에 대해 좀 더 알아보자. Binary Semaphore, C++20 이전 글, Binary Semaphores 예제를 조금 변영하여 의 사용방법을 확인해 보자. 예제 아래 프로그램은 5개의 스레드가 각각 숫자 100개를 출력하는 Binary Semaphore 예제이다. #include #include #include #include #include #include using namespace std::literals; // mutex : ..

L C++/Concurrency 2023.10.17

[Concurrency] race condition 예방 방법 : Mutex와 Semaphore

멀티 스레드로 동작 시 공유 데이터를 동시에 접근하면 경쟁상태(race condition)가 된다. 이전글 참조: 2023.09.19 - [언어/C++] - race condition : thread를 병렬로 그냥 동작시키면 안 되는 이유 데이터를 일관된 상태로 유지하려면 동시 액세스로부터 데이터를 보호해야 하는데 (즉, 데이터에 대한 액세스는 직렬화되어야 한다.) 그 방법을 알아보자. Mutex(뮤텍스) 위 그림에 표현처럼 중요한 섹션은 상호 배제를 보장(critical sections ensure mutual exclusion)하는 방법이 뮤텍스이다. 바로 특정 순간에 하나의 중요 섹션만 공유 데이터에 접근하게 하는 방법이며 이는 데이터 접근에 대한 직렬화를 보장한다. 예제 코드로 좀 더 자세히 확인..

L C++/Concurrency 2023.09.26

race condition : 스레드를 병렬로 그냥 동작 시키면 안 되는 이유

스레드를 이용하면 연산을 단축하여 높은 성능을 끌어낼 수 있다. 하지만 스레드를 사용하면서 발생하는 이슈들을 간과한다면 결국 퍼포먼스를 포기하고 스레드를 들어내야 될지도 모른다. 이를 예방하기 위해 다중 스레드 사용 시 문제가 되는 race condtion(경쟁 상태)에 대해 이해해 보자. 경쟁상태(race condition)의 이해 우선 예제를 보자. 예제 Counter 클래스는 count_ 변수를 가지고 있고, worker() 함수는 Counter 클래스의 increment() 함수(count_ 변수를 1씩 증가하는 함수)를 10만 번 호출하는 코드 #include #include #include class Counter { public: Counter() : count_(0) {} void incr..

L C++/Concurrency 2023.09.19

[Concurrency] Function Templates(함수 템플릿)을 스레드로 실행하기

함수 템플릿은 일일이 타입이 다르게 호출될 수 있는 함수를 하나의 정의로 일괄적으로 처리될 수 있는 기능을 제공한다. 하지만 스레드는 직접 호출하는 모양이 아니라서 타입추론이 안되기에 명시적으로 기재를 해야 하기에 그 사용방법을 알아보자. . 테스트 코드 설명 아래 sum() 함수는 구간의 합을 구하는 템플릿 함수이다. (템플릿 함수에 대해 자세히 알고 싶으면 여기) template void sum(IT first, IT last, RT& result) { result = std::accumulate(first, last, result); } 그리고 std:accumulate 함수는 범위의 값을 합산하여 결과로 리턴하는 함수인데, sum() 함수는 이 함수를 이용하여 구간의 합을 구하고자 한다. std:..

L C++/Concurrency 2023.09.05

[Concurrency] 멀티(복수) 스레드를 보관하는 방법

멀티 스레드를 관리하기 위해 vector를 이용하려고 해도 스레드는 복사생성자를 지원하지 않아 일반 데이터와 동일하게 처리를 할 수 없다. vector를 이용해 멀티스레드를 보관하려는 아래 예제를 보자. #include #include #include #include void do_work(unsigned id) {} int main() { // 참고.. std::thread t1(&do_work, 1); v1.push_back(t1); // error. 복사 생성자가 필요한데.. // std::thread 는 복사 될수 없는타입 // create.. 10 thread std::vector v1; // 초기 크기 0 for (int i = 0; i < 10; i++) { // 참고.. std::threa..

L C++/Concurrency 2023.08.15

40년간의 C++ 표준 변화 요약

40년간 C++ 표준의 변화를 약식으로 정리된 내용을 번역한 글 입니다. C++98 80년대 말에 Bjarne Stroustrup 과 Margaret A. Ellis가 유명한 Annotated C++ Reference Manual (ARM) 책을 저술 이 책의 목적은 두가지 너무 많은 C++ 독립 구현체들이 있었기 때문에 ARM은 C++의 기능을 정의 C++ 표준인 C++98 (ISO/IEC 14882)의 기초가 됨 C++98은 몇몇 중요한 기능들을 포함 Templates STL(Standard Template Library) : 컨테이너, 알고리즘, 스트링, IO Stream들을 포함 C++03 C++03 (14882:2003) 에서는 아주 작은 기술 수정이 이뤄짐 커뮤니티에서는 C++98 을 포함한 ..

L C++ 2023.08.08
320x100