C++ 16

메모리 모델

복습 Race Condition (경합 조건): 여러 쓰레드가 동일한 메모리에 동시 접근할 때 발생. write가 문제임. Undefined Behavior가 발생함. 해결법 : Lock, Atomic C++이 보증하는 기본 원칙 : atomic 연산에 한해 모든 쓰레드가 동일 객체에 대해 동일한 수정 순서를 관찰한다. 이게 무슨 소리인가? atomic 연산 동일 객체란 그냥 하나의 메모리 공간, 변수 쯤으로 생각하면 된다. 동일한 수정 순서란 atomic:: is_lock_free() //lock을 걸 필요 없음(원자적으로 수정됨) true : 원자적 수정. false : 원자적 수정 안됨. atomic의 메모리 정책 메모리 정책에 따라 가시성, 코드 재배치 문젲가 해결되거나 안되거나가 결정됨. 메모리..

C++ 2022.02.01

Futrue

c++ 11에 공식적으로 추가된 내용. #include 동기방식 synchronous : 오래 걸리면 비동기로 하는게 좋다. 조금 오래걸리는 함수 한 번만 실행할건데 그걸 가지고 스레드를 만드는건 좀 낭비같다는 생각이 든다. 즉1회성 이벤트에 유용하다. 이런 상황에서 가볍게 실행가능한 것이 future 이다. 말하자면 '애기 스레드 만들기' 라고 할 수 있다. std::future future = std::async(std::launch::async, Calculate); //async는 defered라는 선택지도 있음. std::future future = std::async(std::launch::async, &Knight::GetHp, knight1); // 함수가 멤버함수일 경우 이렇게 씀. in..

C++ 2022.01.27

조건 변수(Condition Variable)

이전 글에서 멀티쓰레드 이벤트 LOCK 에 대해 알아봤다. https://ddukddaksudal.tistory.com/62 멀티 쓰레드 Lock 구현 Lock 상태일 때 다른 쓰레드는 뭘 할까? 어떤 쓰레드가 lock을 하고 메모리를 차지했다면 다른 쓰레드들은 unlock될 때 까지 기다려야 한다. 그런데 기다린다는 것은 말하자면 시간 낭비이다. 어떻게 ddukddaksudal.tistory.com 그런데 이러면 이벤트와 lock 코드가 분리되어 있기 때문에 쓰레드가 원하는대로 동작하지 않을 수 있다. 예를 들어 handle이 signal 상태가 되어 WaitForSingleObject함수를 탈출하고 lock을 얻으려고 했는데 그 사이에 다시 다른 쓰레드가 lock을 걸어버릴 수 있다는 것이다. 이 문..

C++ 2022.01.27

멀티 쓰레드 Lock 구현

Lock 상태일 때 다른 쓰레드는 뭘 할까? 어떤 쓰레드가 lock을 하고 메모리를 차지했다면 다른 쓰레드들은 unlock될 때 까지 기다려야 한다. 그런데 기다린다는 것은 말하자면 시간 낭비이다. 어떻게 시간 낭비를 줄일 수 있을지 몇 가지 정책을 알아보자. Spin Lock : unlock 될 때까지 무작정 기다리기 Sleep : 일단 물러나고 나중에 다시 돌아오기.(랜덤) Event : 다른 사람한테 unlock 되면 알려달라고 하고 나는 다른일 하고 있기. 대표적으로 위와 같은 정책들이 있다. 아니면 일정 시간 무작정 기다리다가 물러나기 와 같이 위 정책들을 적절히 섞어 써도 된다. 그렇다면 위 정책을 사용하려면 Lock 함수를 어떻게 구현해야 할지 알아보자. Spin Lock lock이 풀릴 때..

C++ 2022.01.26

멀티 쓰레드

c++ 11 이후 에선 #include , std::thread(쓰레드함수) 로 Windows 환경에 종속적이지 않은 멀티 쓰레드를 구현할 수 있다. 엔트리 포인트 : 쓰레드 함수 자식 쓰레드 t가 종료되기 전에 메인 쓰레드가 먼저 종료되면 에러가 뜸. 디버그 시 각 쓰레드별 실행중 문장 확인 가능. 쓰레드 주요 함수들 t.hardward_concurrency() : CPU 코어 갯수 t.get_id() : 쓰레드의 id t.detach() : 쓰레드 객체 t와 실질적으로 동작하는 쓰레드의 연결을 끊어버림. 데몬 프로세스. t.joinable() : t 객체에 실질적으로 연동된 쓰레드가 있는지 확인 = 쓰레드 id가 0인지 확인. (연동된 쓰레드가 없다면 쓰레드 id는 0이 됨) t. join() : 자..

C++ 2022.01.24

생성자

class Man{ public : Man(); // 기본생성자 Man(const Man& m); //복사 생성자 Man(int hp);//타입변환 생성자 Man(int hp, int name); //기타 생성자 } 기본생성자 아무런 인자도 받지 않는 생성자. 아무런 생성자도 만들어주지 않을 경우 복사 생성자와 함께 자동으로 암시적 생성된다. 명시적 선언도 가능. 아래와 같이 사용한다. Man m; //자동으로 기본 생성자 호출 복사 생성자 자신과 같은 타입의 클래스를 인자로 받는 생성자. 아무런 생성자도 만들어주지 않을 경우 기본 생성자와 함께 자동으로 암시적 생성된다. 명시적 선언도 가능. 인자로 받은 객체와 모든 멤버 데이터가 같은 객체를 만든다. 아래와 같이 사용한다. Man m1; Man m2(..

C++ 2021.12.27