목록C++/추가공부 (6)
하아찡

C++ 11에서 메모리 모델에 대한 내용이 확립이 됐습니다.일단 바로 Memory Model 정책에 대한 옵션을 먼저 알아보겠습니다.1. Sequentially Consistent (seq_cst)2. Acquire-Release(acuire, release)3. Relaxed(relaxed) 차이점이 무엇이 있냐.1번은 엄격하게 처리를 하게됩니다. 엄격한게 무엇이냐? 컴파일러 최적화 여지를 적게줍니다. 즉 직관적으로 볼수 있습니다.2번은 보통3번은 자유롭습니다. 즉 컴파일러 최적화 여지가 많습니다.대신 여지가 많은 만큼 직관적이지 못합니다. 일반적으로 그냥 사용하게되면 1번으로 설정이 됐습니다. #include "pch.h"#include #include #include #include #include..
안녕하세요.이번에는 condition variable를 알아보겠습니다.이전에 알아봤던 Event에서 CreateEvent를 사용해서 커널단에 이벤트를 등록하는 방식으로 처리를 해봤습니다.해당방식은 다른 프로세스에게도 이벤트를 전달 할 수 있는데, 나는 내 프로그램 내부에서만 처리가능하면 될거같은데 너무 무겁게 작업하는거 아닌가? 라는 생각을 할 수 있습니다.그래서 있는게 condition variable입니다.condition variable는 유저 모드 이벤트를 생성 및 호출을 하게 가능하게 됩니다.사실 유저모드에서 이벤트가 발생하고 처리가 되는건 아닙니다. 실질적으로 이벤트가 발생했을때는 커널모드의 개입이 필요한데 그 외의 작업들이 유저모드에서 처리가 되기때문에 CreateEvent를 사용해서 이벤트..

안녕하세요이번에는 Event처리를 해볼건데요. 이전에 사용했던 코드를 먼저 봅시다.#include "pch.h"#include #include #include class AdaptiveLock {public: void lock() { int32 spinCount = 0; // Spin 횟수 const int32 maxSpinCount = 100; // Spin 횟수 제한 bool expected = false; bool desired = true; while (!_locked.compare_exchange_weak(expected, desired)) { expected = false; ..

이전에는 SpinLock을 살펴보았는데이번에는 SleepLock을 살펴보겠습니다. 사실 SpinLock에 반복문 내부에 "일정시간 대기해라" 코드 한줄만 추가해주면 바로 SleepLock으로 변경하여 사용할 수 있습니다.#include "pch.h"#include #include #include class SleepLock {public: void lock() { bool expected = false; bool desired = true; while (!_locked.compare_exchange_weak(expected, desired)) { expected = false; //기존 SpinLock에서 SleepLock..

atomic은 원자라는 뜻을 가지고있는데원자적인 연산을 한다라고 생각을 하시면됩니다.원자적인 연산이란게 무엇일까? 더이상 쪼개질 틈이 없어 다른 쓰레드가 연산할 틈을 안준다라고 생각하시면 될거같습니다.그래서 atomic은 둘중에 한개입니다. 전부 처리를했다 혹은 처리를 하지못했다 이두가지로 나눠지게 됩니다. 그러면 저게 도대체 무슨소리인가? 코드를 전부처리했다? 처리하지못했다? 이게 뭐가 중요할까요? 둘다 중요합니다. 하지만 여기서 또 봐줘야할점이 "다른 쓰레드가 연산할 틈을 안준다" 이것도 중요하다고 봅니다. 이게 사실 싱글쓰레드에선 별일이 아닙니다. 그저 순서를 지키고 처리가 될뿐인데, 별일이 아닌곳은 바로 멀티쓰레드 환경에서는 매우 중요한 일입니다. 왜? 멀티쓰레드환경에서 중요한일 인가?싱글쓰레..

Volatile 예약어해당 키워드를 붙여서 작업할 경우 컴파일 과정에서 최적화를 하지 않습니다.해당 소리가 무엇이냐 아래 코드에서 확인해보겠습니다. #include int main(){ volatile int a = 5; a = 7; a = 8; a = 9;} 예를들어 위와 같은 코드가 있습니다. a변수는 volatile를 붙여서 선언했습니다.이과정에서 원래같으면 컴파일러가 최적화 과정에서 불필요한 과정인 a = 7; a = 8;를 무시하고 a = 9;코드만 사용하게 되는데, volatile를 사용한 변수는 해당 과정이 컴파일을 했을때 전부다 작동하게 합니다. 이걸 실제 디스어셈블로 확인해보면위와 같은 코드로 나타나는데 a변수를 처리하는데 있어서 불필요한 과정을 다 처리했습니다. ..