일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- more effective c++
- resource management class
- effective modern c++
- UE4
- 티스토리챌린지
- reference
- Effective c++
- implicit conversion
- operator new
- 보편 참조
- 언리얼
- Smart Pointer
- 반복자
- 영화
- c++
- iterator
- exception
- std::async
- 게임
- 영화 리뷰
- 스마트 포인터
- 참조자
- virtual function
- 암시적 변환
- effective stl
- lua
- 예외
- 오블완
- universal reference
- 상속
- Today
- Total
목록전체 글 (240)
스토리텔링 개발자
항목 41. 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라 복사되도록 만들어진 함수 매개변수class Widget{public: // 이 버전은 복사되도록 만들어졌다. void addName(const std::String& newName) // lValue { names.push_back(newName); // 복사 } // 이동 버전 void addName(std::string&& newName) // rValue { names.push_back(std::move(newName)); // 이동 } ... private: std::vector names;};이 경우 본질적으로..

항목 40. 동시성에는 std::atomic을 사용하고, volatile은 특별한 메모리에 사용하라 volatile사실 동시적 프로그래밍과는 무관하다.하지만 다른 언어에서는 volatile이 동시적 프로그램에 유용하다.C++에서도 일부 컴파일러는 동시적 소프트웨어에 적용할 수 있을 수도 있다.volatile은 다중 스레드에서 거의 아무것도 보장하지 않는다!volatile int vi(0);vi = 10;std::cout 위 코드를 실행하는 동안 다른 스레드들은 vi의 값을 0, 10, 11만 본다고 보장할 수 없다.이처럼 writer와 reader가 동시에 접근하려고 하면 자료 경쟁(data race)이 발생할 수 있다.C++에서는 std::atomic를 사용해야 한다. std::atomic다른 ..
항목 39. 단발성 이벤트 통신에는 void future 객체를 고려하라 스레드 간 통신을 처리하는 방법 특정 이벤트를 감지하여 브로드캐스팅 하는 task가 유용할 때가 있다.자료구조의 초기화계산 과정 중 특정 단계의 완료 등.이런 통신은 어떻게 처리해야 할까? 조건 변수(condition variable, condvar)조건 변수를 사용하여 해결해 본다.검출 task(detecting task)조건을 검출하는 task반응 task(reacting task)조건에 반응하는 task반응 task는 하나의 조건 변수를 기다리고,검출 task는 사건이 발생하면 그 조건 변수를 노티한다.std::condition_variable cv; // 이벤트를 위한 조건 변수std::mutex m; // cv와 함..

항목 38. 스레드 핸들 소멸자들의 다양한 행동 방식을 주의하라 시스템 스레드의 핸들(handle) 종류joinable(합류 가능) std::thread지연되지 않은 task(항목 35 참조)의 future 객체허나 이 둘의 소멸자는 아주 다르게 동작한다. joinable std::thread의 소멸자프로그램이 종료된다.(항목 37 참조) future 객체의 소멸자상황에 따라 암묵적 join, 암묵적 detach로 동작한다.허나 프로그램이 종료되는 일은 없다. future 객체의 행동 방식future 객체는 호출한 쪽에서 피호출자의 값을 읽기 위해 사용하는 채널이다.피호출자는 (보통은 비동기적으로) 계산하여 그 결과를 통신 채널에 기록한다.(보통은 std::promise)호출자는 future..
항목 37. std::thread들을 모든 경로에서 합류 불가능(unjoinable)하게 만들어라 합류 가능(joinable) std::thread현재 실행중이거나 실행중 상태로 전이할 수 있는 스레드이에 대응하는 객체차단된 상태인 std::thread실행 일정을 기다리는 중인 std::thread실행 완료된 std::thread 합류 불가능(unjoinable) std::thread합류할 수 없는 스레드이에 대응하는 객체기본 생성된 std::thread실행할 함수가 없기 때문이다.다른 std::thread 객체로 이동된 후의 std::thread바탕 스레드가 다른 std::thread의 바탕 스레드가 된다.join에 의해 합류된 std::threadjoin 이후의 std::thread 객체는 실..
항목 36. 비동기성이 필수일 때에는 std::launch::async를 지정하라 std::async 호출함수를 비동기적으로 실행하겠다는 의미하지만 늘 그런 의미일 필요는 없다.함수를 어떤 시동 방침(launch policy)에 따라 실행한다는 의미도 가진다. 표준이 제공하는 시동 방침std::launch 라는 enum으로 제공된다.std::launch::asyncf는 반드시 비동기적으로(다른 스레드에서) 실행된다.std::launch::deferredf는 std::async가 리턴한 future 객체에 대해 get이나 wait가 호출될 때까지 실행이 지연된다.std::async의 기본 방침은 위 두 가지를 or로 결합한 것이다.결과적으로 기본 방침으로는 함수의 실행이 비동기일수도 동기일수도 있다...
항목 35. 스레드 기반 프로그래밍보다 태스크 기반 프로그래밍을 선호하라 함수 비동기 호출doAsyncWork라는 함수를 비동기로 실행한다고 하면..방법은 두 가지이다.std::thread 객체를 생성스레드 기반(thread-based) 프로그래밍std::async를 사용태스크 기반(task-based) 프로그래밍int doAsyncWork();// 스레드 기반std::thread t(doAsyncWork);// 태스크 기반auto fut = std::async(doAsyncWork); 두 방법의 차이점doAsyncWork는 리턴값이 있는데...스레드 기반에서는 여기에 접근할 방법이 없다.태스크 기반에서는 async가 리턴한 객체(future 객체)를 통해 접근할 수 있다.doAsyncWork가 ..
항목 34. std::bind보다 람다를 선호하라 이유 1 : 가독성람다가 가독성이 더 좋다.using Time = std::chrono::steady_clock::time_point;enum class Sound { Beep, Siren, Whistle };using Duration = std::chrono::steady_clock::duration;// t 시간에 s 사운드를 d 동안 출력하라void setAlarm(Time t, Sound s, Duration d);람다 버전// 한시간 후부터 30초간 울리게 하는 함수 객체auto setSoundL = [](Sound s){ using namespace std::chrono; setAlarm(steady_clock::now()..