1. 스레드 풀이란 미리 생성된 여러 개의 작업자 스레드를 관리하는 소프트웨어 디자인 패턴다수의 작은 태스크를 효율적으로 처리하기 위해 사용된다. 특징: - 성능 향상 : 스레드 생성 및 소멸 비용을 줄인다. - 리소스 관리 : 동시에 실행되는 스레드 수를 제한하여 시스템 리소스를 효율적으로 사용한다. - 안정성 : 과도한 스레드 생성으로 인한 시스템 부하를 방지한다. - 재사용성 : 스레드를 재사용하여 효율성을 높인다. 2. 스레드 풀 구현 구현 순서:1) 작업 큐 생성2) 스레드 풀 생성3) 작업 제출 메커니즘 구현4) 결과 반환 메커니즘 구현 ex)#include #include #include #include #include #include using namespace std;class T..
1. 세마포어(Semaphore)동시에 리소스에 접근할 수 있는 스레드의 수를 제한하는 동기화 기법 특징: - 사용 가능한 리소스의 수를 나타내는 정수 값을 가짐 - P(획득) 연산과 V(해제) 연산을 제공 - 카운팅 세마포어와 이진 세마포어로 구분됨 (C++20 이후) 1.1. 카운팅 세마포어 vs 이진 세마포어 값의 범위: - 카운팅 세마포어: 0 이상의 정수 값을 가질 수 있음 - 이진 세마포어: 0 또는 1의 두 가지 값만 가질 수 있음 용도: - 카운팅 세마포어: 여러 개의 리소스를 관리할 때 사용 - 이진 세마포어: 하나의 리소스에 대한 접근을 제어할 때 사용되어 뮤텍스와 유사하게 사용 가능 동작 방식: - 카운팅 세마포어: 여러 프로세스가 동시에 리소스에 접근 가능 ..
1. Condition Variable이란멀티스레딩 환경에서 스레드 간 시그널링 메커니즘을 제공하는 동기화 도구이다. 주로 특정 조건이 만족될 때까지 스레드를 대기시키고, 조건이 만족되면 대기 중인 스레드에게 알림을 보내는 데 사용된다. 특징:- 스레드 간 통신을 가능하게 함- 대기(wait)와 통지(notify) 작업을 지원- 일반적으로 뮤텍스(mutex)와 함께 사용 2. 사용법Condition Variable은 race condition을 방지하고 안전한 상태 검사를 보장하기 위해 항상 Mutex와 함께 사용된다. 사용 예시:1) Mutex를 잠근다.2) 조건을 검사한다.3) 조건이 만족되지 않으면 Condition Variable의 wait을 호출한다.4) 조건이 만족되면 작업을 수행한다.5) ..
1. std::future와 std::promiseC++11에서 도입된 비동기 프로그래밍을 위한 도구 std::future : 비동기 작업의 결과를 나타내는 객체. 미래의 어느 시점에 값이 설정될 것임을 나타낸다.std::promise : future에 값을 설정하는 쓰기 가능한 끝점 이 둘은 서로 쌍을 이루어 동작하며, 다른 스레드에서 실행되는 작업의 결과를 안전하게 전달할 수 있게 한다. ex)#include #include #include using namespace std;void SetValue(promise& p) { this_thread::sleep_for(chrono::seconds(2)); p.set_value(10);}int main() { promise p; fu..
1. 스핀락이란동기화 메커니즘의 한 종류로, 바쁜 대기(Busy waiting) 방식을 사용한다. lock을 획득하려는 스레드가 lock이 해제될 때까지 계속해서 lock의 상태를 확인한다. 이 과정에서 CPU 사이클을 소비하며 "spin"(회전)한다고 표현한다.일반적으로 atomic 변수를 사용하여 구현한다. 2. 스핀락 vs 일반 Lock스핀락: - 짧은 임계 영역, 컨텍스트 스위칭 비용이 큰 경우 - CPU 사용률이 높지만, 대기 시간이 짧음 일반 Lock: - 긴 임계 영역, 대기 시간이 길 수 있는 경우 - CPU 사용률이 낮지만, 컨텍스트 스위칭으로 인한 오버헤드 발생 3. 스핀락 사용 시나리오lock을 획득할때까지 계속해서 lock의 상태를 확인하기 때문에 빠른 연산이나 짧은..
1. 데드락이란두 개 이상의 스레드가 서로가 보유한 자원을 기다리며 무한히 대기하는 상태데드락이 발생하기 위해서는 다음 네 가지 조건이 동시에 충족되어야 한다. 1) 상호 배제(Mutual Exclusion): 최소한 하나의 자원이 독점적으로 사용되어야 함2) 점유와 대기(Hold and Wait): 스레드가 최소 하나의 자원을 보유한 채 다른 스레드에 할당된 자원을 추가로 요청해야 함3) 비선점(No Preemption): 자원을 강제로 빼앗을 수 없어야 함4) 순환 대기(Circular Wait): 스레드 간에 순환적인 형태로 자원을 기다리는 관계가 형성되어야 함 예를 들어, 스레드 t1이 자원 X를 보유하고 자원 Y를 기다리는 동시에, 스레드 t2가 자원 Y를 보유하고 자원 X를 기다리는 상황이 데..