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

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

전체 글 128

2023년 '회고' 그리고 100번째 글

57 < 332022년 57개의 글, 2023년 33개의 글 육아를 하며 아기가 기억하지 못하는 당시 생각이나 마음을 남겨두면 돈 주고도 사지 못하는 의미 있는 선물이 될 것 같아 블로그를 시작했지만 공부한 내용들도 함께 올리다 보니 벌써 100번째 글을 쓰게 되었다. (비밀 공개 글 2개 포함) 글을 잘 쓰지도 못하면서 빨리 쓰지도 못해 굉장히 많은 시간을 들였었다. '내용이 굉장히 짧은데도 말이다.' 하지만 공을 들여서일까? 작년보다 더 적은 글을 썼지만 하나하나의 글이 너무 소중하게 느껴지고, 글을 쓰면서 몰랐던 나 자신에 대해 조금 더 알게 되어 너무 좋았다. 피 말리는 하반기 시작 삘 받아서 연달아 쓰기도, 싫증이 나서 쓰지 않기도 하는 등 불 규칙한 업데이트를 한 상반기를 보내며 '좀 더 구독..

회고 & 후기 2023.12.26

[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

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