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

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

C++ 35

[Concurrency] std::call_once - 중복 초기화 해소 기술

중복으로 초기화를 해야 하는 경우 보통 어떻게 하시나요? 저는 이럴 경우 flag를 둬서 두 번 호출하게 하지 않거나, 기존 함수를 한 번만 호출되는 함수와 두 번 호출되는 함수로 분리하는 방식으로 수정했었습니다. 여러분은 어떻게 하시나요? 생각해 봅시다. 예를 들어 아래 foo 함수 내에서 init 그리고 work 함수를 호출하는 foo를 멀티 스레드로 동작시키는 경우를 생각해 보자. foo -> init -> work 아래와 같이 실행이 될 텐데 Thread 1 : foo -> init -> work Thread 2 : foo -> init -> work 예제 1 foo를 다수의 스레드로 실행하여 스레드 수만큼 init이 실행되는 프로그램 코드이다. #include #include #include #..

L C++/Concurrency 2023.12.12

[Concurrency] thread_local - thread 전용 변수 ✔

생각해 봅시다. Process 끼리는 메모리 할당이 서로 접근할 수 없게 독립적으로 분리되어 있다. 이런 콘셉트로 스레드끼리도 메모리를 독립적으로 쓸 수 있는 방법은 없을까? 🙄 필요성을 좀 더 느끼기 위해 아래 예제를 봅시다. A, B 스레드 각각 독립적으로 1씩 증가하여 3을 만드는 프로그램을 짜는데 지역변수를 사용하면 원하는 결과가 안 나온다. n을 어떻게 선언하면 이 문제를 해결할 수 있을까? 지역 변수 n 예제 1 A, B 스레드 각각 독립적으로 1씩 증가를 지역변수 n을 이용한 프로그램 코드이다. #include #include #include //thread_local int n = 0; int increase() { int n = 0; // 지역변수, 스택 사용 //static int n ..

L C++/Concurrency 2023.12.05

[Concurrency] std::jthread - join 없이 사용하기📌

C++에서 join(혹은 detach) 없이 사용할 수 있는 thread는? 바로 jthread와 async가 떠오르지 않았다면 본 글에서 std::jthread를 알아보자. (async는 아래 글 참조) 2023.11.21 - [L C++] - [thread] std::async - 기존 함수 그대로 thread에 적용(2) std::jthread 란? C++ 20에 추가된 클래스로, 모듈에 포함되어 있고, 크게 두 가지 기능을 가지고 있는 스레드이다. joining thread : 클래스에 join이 포함되어 있어 따로 join을 하지 않아도 된다. cooperatively interruptible : 협력적으로 중단(취소)이 가능하다. Joining thread(스레드 결합) 주 스레드가 종료하면 ..

L C++/Concurrency 2023.11.28

[Concurrency] std::async - 기존 함수 그대로 thread에 적용(2)

(return이 있는) 기존 함수를 수정 없이 thread로 사용하기(2)😆 참고 : 본 글은 promise/future 모델, packaged_task에 대한 이해를 해야만 std::async를 이해할 수 있기에 두 내용을 모르고 있다면 아래 내용을 공부한 뒤에 본 글을 읽어주기 바란다. 2023.10.25 - [L C++] - [thread] Promise /Future 모델 필요성 및 사용 방법 2023.11.14 - [L C++] - [thread] packaged_task - 기존 함수 그대로 thread에 적용(1) 그럼 기존 함수를 수정 없이 스레드로 동작시킬 수 있는 std::async에 대해 알아보자. std::async std::async 🆚 std::packaged_task 차이 st..

L C++/Concurrency 2023.11.21

[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] 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

깊이/너비 우선 탐색(DFS/BFS) / 타겟 넘버 / C++

문제 설명 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 제한 사항 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. 각 숫자는 1 이상 50 이하인 자연수입니다. 타겟 넘버는 1 이상 1000 이하인 자연수입니다. 입출력 예 numbers target return [1, 1, 1, 1, 1] 3 5 [4, 1, 2, 1] 5 2 문제 이해 처음부터 끝자리 수까지 더해야 한다. 각 자리마다 음수 혹은..

320x100