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

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

L C++/Concurrency 28

[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

[Concurrency] 인자와 callable object

기존 함수를 thread로 실행시킬 수 있을까?🤔 목적 : 설계 때부터 thread 사용을 고려했다면 문제가 없었겠지만, 이미 구현까지 완료된 함수를 thread로 동작시켜야 할 때는 thread 함수를 사용하기 위한 기존 소스의 수정이 필요하다. 최대한 수정 없이 thread로 동작시킬 수 있는 방법은 없는지 알아보자. Thread 함수 인자 std::thread의 생성자는 "가변인자 템플릿"으로 되어 있어 인자수를 원하는 만큼 늘릴 수 있으며, thread로 실행시키기 위해서는 호출될 함수를 참조로 전달해야 하고 그 함수에 호출되는 인자를 다음인자로 넘기면 된다. 아래 f1, f2, f3를 thread로 실행하는 아래 예제를 참고해 보자. #include #include #include void f1..

L C++/Concurrency 2023.07.24

[Concurrency] 좀비 스레드 생성될 수 있는가?

thread는 한정된 자원을 효율적으로 사용할 수 있는 기능이지만 잘 알고 다뤄야 합니다. 만약 저처럼 좀비 thread가 있을 수 있을까?라고 생각하는 사람이 있다면 아래글을 참고 부탁 드립니다. 일반적으로는 zombie thread는 생성되지 못한다. zombie thread는 생길 수 없다. thread는 메인스레드나 프로세스가 종료가 되면 자동으로 종료되기 때문이다. -끝 그럼 zombie thread가 생성되는 경우는? 스레드 커널객체에 참조계수(usage count)가 있다. 만약 thread 하나가 생성되면 usage count 가 2가 된다. (새로 생성한 thread + 주 thread) 이때 새로 생성한 thread를 종료하지 않고 주 thread가 종료되면 OS가 자동으로 모든 핸들을..

L C++/Concurrency 2023.07.18

[Concurrency] this_thread 특징

this_thread 함수 특징에 대해 정리하고자 한다. std::thread::id 특징 1. std::this_thread::id를 화면에 출력하면 정수로 표현되지만 실제는 정수 타입이 아니며 변환도 안된다. //특징 1 int n = tid1; // error. std::thread::id tid1 = std::this_thread::get_id(); 2. 컨테이너에 보관 가능하고, hash도 가능하다 //2. 컨테이너에 보관 가능하고, hash 도 가능 std::vector v; // ok.. std::hash h; // ok // 특징 3. == , != 연산 가능합니다. tid1 == tid1; 3. 연산이 가능하다. (== , ..

L C++/Concurrency 2023.07.11

[Utilities] thread를 잘 사용하기 위한 std::reference_wrapper (std::ref) (활용 예시 추가)

문제점 thread 내에서 동작한 값을 얻을 수 있는 리턴 값이나 인자 값을 받을 수 없을 때 인자수를 조정할 수 있는 bind를 이용할 수 있지만 binding 하는 함수의 인자를 참조해도 참조가 되지 않는다. 해결 방법 함수자체를 포인터를 넘겨서 값을 받아오거나(call by address), std::reference_wrapper(혹은 std::ref)를 사용하면 참조가 안 되는 문제를 해결할 수 있다. 활용 예시 다음은 std::bind를 이용하여 인자수를 조정하고 foo 함수의 결과를 얻는 예제코드이다. main 함수에 n = 0 의 값을 foo 함수 내에서 처리된 100의 값을 얻고 싶다. 코드 실행해보기 (아래 우측 상단 아이콘 선택 시 실행 가능) 전체코드 한눈에 보기 더보기 #inclu..

L C++/Concurrency 2023.05.28

[Utilities] std::reference_wrapper (std::ref) : thread를 잘 사용하기 위해 필요한 템플릿 클래스

본 글은 std::reference_wrapper 의 용도와 목적에 대한 글이기에 std::reference_wrapper 사용방법을 알고싶다면 다른 글에서 확인 부탁 드립니다. 필요성 thread 로 동작시켜야 할 함수(or 클래스)가 있는데 thread 내에서 계산을 하고 그 값을 main thread를 받아야 할 때 '전역변수'로만 사용하고 있다면 std::reference_wrapper 를 알아두면 좋다. 활용 예시 다음 예제코드는 std::reference_wrapper 활용하여 원하는 n의 값을 얻는 예제코드이다. main 함수에 n = 0 의 값을 foo 함수 내에서 처리된 10의 값을 얻고 싶다. 코드 실행해보기 (아래 우측 상단 아이콘 선택 시 실행 가능) 전체코드 한눈에 보기 더보기 #..

L C++/Concurrency 2023.05.28
320x100