728x90 멀티쓰레드6 Event 커널에게 유저레벨에서 쓰레드끼리의 순서 보장에 대한 결론이 나지 않다 보니 순서 보장을 해달라고 요청하는것. Event는 일단 TRUE, FALSE 두값을 가지고 있는 객체라고 개념적으로 생각 할 수 있음. 문이잠긴다, 문이 열린다. 이벤트 관련 함수는 `CreateEvent`, `SetEvent`, `WaitForSingleObject`가 있는데 Windows 운영체제에서 제공하는 동기화 함수이다. 1. **CreateEvent**: 이 함수는 이벤트 객체를 생성한다. 이벤트 객체는 시그널 상태와 논시그널 상태를 가질 수 있다. 이 함수를 호출하면, 이벤트 객체가 생성되고, 이 객체에 대한 핸들이 반환된다. 이 핸들은 이후에 이벤트의 상태를 변경하거나 확인하는 데 사용된다. 2. **SetEvent**.. 2024. 3. 6. SpinLock 스핀락(SpinLock)은 임계 구역(critical section)에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 말한다. 스핀락이라는 이름은 락을 획득할 때까지 해당 스레드가 빙빙 돌고 있다(spinning)는 것을 의미한다. 스핀락은 두 개의 상태를 가질 수 있는 변수를 갖는 낮은 단계의 동기화 메커니즘이다. 두상태는 아래와 같다. 1. 획득됨 (acquired) 2. 해제됨 (released) 락의 장점은 '인터럽트 컨텍스트’에서도 사용할 수 있다는 것이다. 인터럽트 컨텍스트란, 컴퓨터가 중요한 작업을 처리하고 있을 때 다른 작업을 일시 중단하는 상황을 말한다. 이런 상황에서는 일반적으로 ‘잠자기’ 상태인 뮤텍스나 세마포어 같은 도구를 사용할 수 없다. .. 2024. 3. 5. 락 기초 #include #include #include vector v; void push() { for (int i = 0; i < 10000; ++i) { v.push_back(i); } } int main() { std::thread t1(push); std::thread t2(push); t1.join(); t2.join(); cout 2024. 3. 4. Atomic #include #include int32 sum = 0; void Add() { for (int i = 0; i < 100'0000; ++i) ++sum; } void Sub() { for (int i = 0; i < 100'0000; ++i) --sum; } int main() { Add(); Sub(); return 0; } 이상황에서 Sum 은 당연한 결과지만 0이 될 것이다. 하지만 멀티쓰레드 환경에서 돌린다면 어떻게 될까? #include #include int32 sum = 0; void Add() { for (int i = 0; i < 100'0000; ++i) ++sum; } void Sub() { for (int i = 0; i < 100'0000; ++i) --sum; } int ma.. 2024. 3. 3. 쓰레드 생성 int main() { //SystemCall (OS 커널 요청) cout 2024. 3. 3. 멀티 쓰레드 C++에서 멀티스레드는 동시에 여러 작업을 수행할 수 있게 해주는 기능이다. 각 스레드는 독립적인 실행 흐름을 가지며, 별도의 스택을 가진다. 이를 통해 프로그램의 성능을 향상시킬 수 있다. 쉽게 말해 그림판, 메모장 등 여러 프로그램을 켰을때 그 프로그램들에 쓰레드들이 배치되어 동시에 작동하게 해준다. 이때 이 쓰레드를 작동시키는 것은 CPU 의 코어 이다. 멀티스레드 프로그래밍의 핵심 개념 스레드(Thread): 운영체제로부터 자원을 할당받은 작업의 단위 프로세스(Process): 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위 멀티스레딩(Multi-Threading): 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키.. 2024. 3. 3. 이전 1 다음 728x90