본문 바로가기

컴퓨터61

Modern Effective C++ item 27 : Universal Reference 오버로딩의 대안들 Universal Reference 오버로딩의 대안들item 26에서 universal reference를 오버로딩하는 것의 문제점에 대해서 이야기했다. 하지만 universal 오버로딩 방식의 장점도 분명하다. 이 장에서는 그런 상황에 처했을때, 어떻게 곁가지 문제들을 회피하면서 원하는 기능을 수행할 수 있는지를 이야기 할 것이다.오버로딩 금지item 26의 logAndAdd 예시를 생각해보자. universal reference의 강력한 포용력(?)때문에 다른 오버로딩들이 씹혀버리는 불상사가 발생하였다. 그렇다면 그냥 오버로딩을 포기하는게 속편할 수 있다. logAndAddName 과 logAndAddNameIdx 같은 느낌의 이름으로 바꾸면 일차적으로 해결은 된다. 그런데 생성자는 어떻게 이름을 바.. 2015. 5. 6.
멀티쓰레드 서버 버그잡기 멀티 쓰레드 버그잡기 1. LockOrderCheckervoid LockOrderChecker::Pop(FastSpinlock* lock) { /// 최소한 락이 잡혀 있는 상태여야 할 것이고 CRASH_ASSERT(mStackTopPos > 0); /// 당연히 최근에 push했던 녀석이랑 같아야겠지.. CRASH_ASSERT(mLockStack[mStackTopPos - 1] == lock); mLockStack[--mStackTopPos] = nullptr; } 버그 메시지는 여기서부터 시작한다. Lock Stack의 top과 pop할 대상 lock이 다르다! 이 스택은 LockOrderChecker에서 LockHierachy 유지를 위해서 사용하던 스택이다. 스택하면 생각나는 버그는 ABA이다. .. 2015. 5. 4.
Modern Effective C++ item 25 : std::move / std::forward 를 적재적소에 사용하자. std::move / std::forward 를 적재적소에 사용하자.item 23,24에서 이야기한 것처럼, std::move는 인자를 무조건적으로 rvalue reference로 캐스팅하고, std::forward는 인자가 rvalue인지 체크해서 조건부로 rvalue reference로 변경한다. 여기서 주의해야할 사항이 있다. universial Reference에는 std::move를 사용해선 안되고, rvalue reference에는 std::forward를 사용해선 안된다. 전자는 정말 위험하다.universial Reference에 std::move를 쓰지말자.class Widget{ public: template void setName(T&& newName) //T&&는 universial.. 2015. 4. 28.
Lock Free Lock Free지금까지 자원 Lock의 필요성과 여러가지 Lock의 활용방식을 공부했다. 논리적 측면에서 Deadlock 이슈를 피해서 lock을 사용한다면, 문제없이 자원공유가 가능한 것처럼 보인다^^. 하지만 멀티 쓰레드 프로그래밍의 어려움은 여기서 부터 시작한다. 앞에서 조금씩 언급했지만, 무차별적인 Lock은 기아현상을 유발할 수 있다. 사용자가 느끼기에 중요한 쓰레드가 상대적으로 별로 중요하지 않은 쓰레드에 밀려서 자원획득을 못하고 있을 가능성도 있다. 프로그래머가 프로그래밍을 잘하면 해결할 수 있는 문제라고 생각할지도 모른다.그럼 성능이슈는 어떤가? CRITICAL_SECTION을 사용하는 Mutex역시 시스템 자원이다. Lock을 거는것 하나하나가 시스템 자원요청이라고 생각하면 락을 거는 .. 2015. 4. 28.