1. Mutex란Mutex(Mutual Exclusion)는 여러 스레드가 공유 리소스에 동시에 접근하는 것을 방지하는 동기화 기법이다. Mutex를 사용하면 한 번에 하나의 스레드만 임계 영역에 진입할 수 있다. 특징:1) 상호 배제: 한 스레드가 뮤텍스를 소유하고 있으면 다른 스레드는 대기해야 함2) 소유권: 뮤텍스를 획득한 스레드만 해제할 수 있음3) 임계 영역 보호: 공유 리소스에 대한 동시 접근을 막아 데이터 일관성 유지 2. Mutex 사용법C++11부터 헤더를 통해 mutex 클래스를 제공한다. ex)#include #include #include std::mutex mtx;int num = 0;void Increment() { for (int i = 0; i RAII(Resou..
1. Lock이란멀티스레딩 환경에서 공유 자원에 대한 접근을 제어하는 동기화 메커니즘Lock의 주요 목적은 여러 스레드가 동시에 같은 자원에 접근하는 것을 방지하여 데이터의 일관성을 유지하는 것이다. 주요 Lock 종류: 1) 상호 배제 Lock (Mutual Exclusion Lock) - 가장 기본적인 형태의 Lock - 한 번에 하나의 스레드만 임계 영역에 진입 가능 2) 읽기-쓰기 Lock (Read-Write Lock) - 읽기 작업과 쓰기 작업을 구분 - 여러 스레드가 동시에 읽기 가능, 쓰기는 독점적으로 수행 3) 재진입 가능 Lock (Reentrant Lock) - 같은 스레드가 이미 획득한 Lock을 다시 획득 가능 - 재귀적 알고리즘이나 중첩된 메서드 호출에서 유..
1. Atomic 연산중간 상태 없이 한 번에 완전히 수행되는 연산다른 스레드가 연산 중간에 끼어들 수 없음을 보장한다. 특징: - 불가분성 (Indivisibility): 연산이 완전히 수행되거나 전혀 수행되지 않음 - 일관성 (Consistency): 다른 스레드에서 중간 상태를 관찰할 수 없음 - 순서성 (Ordering): 메모리 순서 (Memory Ordering) 보장 2. Atomic 변수 사용법C++11부터 헤더를 통해 atomic 타입을 제공한다. ex)#include #include #include std::atomic num(0);void Increment() { for (int i = 0; i 주요 atomic 연산: store() 값 저장 load() 값 로..
1. 메모리 계층 구조1.1. 캐시 메모리 (L1, L2, L3 캐시)L1 캐시: - CPU 코어에 가장 가까운 캐시 - 보통 32KB ~ 64KB 크기 - 접근 속도: ~4 사이클 - 일반적으로 명령어 캐시와 데이터 캐시로 분리됨 L2 캐시: - L1보다 크고 느림 - 보통 256KB ~ 512KB 크기 - 접근 속도: ~10 사이클 - 대부분의 경우 코어별로 독립적 L3 캐시: - 가장 큰 온칩 캐시 - 보통 수 MB ~ 수십 MB 크기 - 접근 속도: ~40 사이클 - 일반적으로 모든 코어가 공유 캐시의 역할:1) 자주 사용되는 데이터를 빠르게 접근할 수 있는 위치에 저장2) 메모리 접근 지연 시간 감소3) 메모리 대역폭 병목 현상 완화 멀티스레딩에서의 주의점: - 캐시 ..
1. 경쟁 상태 (Race condition)경쟁 상태는 둘 이상의 스레드가 공유 데이터에 동시에 접근하여 예측할 수 없는 결과를 초래하는 상황을 말한다. ex)#include #include int num = 0;void Increment() { for (int i = 0; i 위 예시에서 `num`은 race condition의 대상이 된다.두 스레드가 동시에 이 변수를 증가시키려고 하면, 일부 연산이 손실될 수 있다. 2. 임계 영역(Critical Section)임계 영역은 여러 스레드가 동시에 접근해서는 안 되는 공유 자원을 접근하는 코드 영역을 말한다.임계 영역에 대한 접근은 상호 배제(mutual exclusion)를 통해 동기화되어야 한다. 임계 영역의 특성 :- 한 번에 하나의 ..
1. 스레드 생성 방법C++에서 스레드를 생성하는 방법 1) std::thread 클래스 사용:#include #include void ThreadFunction() { std::cout 2) 람다 함수 사용:#include #include int main() { std::thread t([](){ std::cout 3) 함수 객체(Functor) 사용:#include #include class ThreadFunctor {public: void operator()() { std::cout 2. 스레드 생명주기1) 생성(Created): std::thread 객체가 생성되면 새로운 스레드가 시작됨2) 실행 가능(Runnable): 스레드가 실행될 준비가 되었지만, ..
내 블로그 - 관리자 홈 전환 |
Q
Q
|
---|---|
새 글 쓰기 |
W
W
|
글 수정 (권한 있는 경우) |
E
E
|
---|---|
댓글 영역으로 이동 |
C
C
|
이 페이지의 URL 복사 |
S
S
|
---|---|
맨 위로 이동 |
T
T
|
티스토리 홈 이동 |
H
H
|
단축키 안내 |
Shift + /
⇧ + /
|
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.