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

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

Thread 25

[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

[Concurrency] 주요 기능 member type / class / functions 정리

thread 주요 기능을 정리하였다. member type native_handle_type native_handle() 멤버 함수의 반환 타입 member class id thread id를 담는 타입 member functions hardware_concurrency CPU가 지원하는 thread 개수, static get_id 스레드 ID 반환 native_handle OS의 스레드 핸들 반환 swap 스레드 Object swap 복사는 불가능하고 이동(move)은 가능하다. joinable join이 가능한지 여부 조사 join 스레드 종료 대기 detach 스레드 떼어 내기 native_handle 스레드는 운영체제의 자원을 이용하고 직접적인 접근은 못하게 되어 있기에, native_handle..

L C++/Concurrency 2023.08.01
320x100