본문 바로가기

전체 글49

lvalue와 rvalue + 우측값 참조법 * lvalue와 rvalue란? C++ 내에서 모든 식들은 카테고리라는 부가적인 정보를 포함하고 있다. l-value와 r-value가 이에 해당되는데, lvalue는 읽고 대입할 수 있는 값, 식(expression)에서 좌측에 존재하기에 좌측 값(left value)라 불린다. 이름을 가진 대부분의 값들은 lvalue에 포함된다. 이름을 가졌다는 것은 메모리를 가지고 있다는 뜻이고 이는 대입할 수 있는 주소값을 가지고 있다는 뜻이기 때문이다. rvalue는 읽기만 할 수 있는 값, 식(expression)의 우측에 존재하기에 우측 값이라 불린다. lvalue와 반대로 주소값을 가지지 않고 명확한 실체가 존재하지 않는 값이라 할 수 있다. 대표적으로 상수 혹은 연산자, 람다 등이 포함된다. 실체를 가.. 2021. 12. 21.
스마트 포인터 (Smart Pointer) 스마트포인터는 포인터처럼 활용하는 클래스 템플릿으로 메모리를 자동으로 해제해준다. 일반적으로 동적할당한 메모리는 해제 코드를 작성하지 않을 경우 Memory Leak이 발생하는데, 스마트 포인터는 이를 방지해준다. 이전 C++( 내가 처음으로 접했던 C++ 전공책) 에서는 스마트포인터가 auto_ptr로써 소개되었지만 C++11 이후로는 auto_ptr이 삭제되고, unique_ptr, shared_ptr, weak_ptr 세 가지로 존재한다. * unique_ptr 기본 포인터로 한 명의 소유자만 허용하는 스마트 포인터이다. 새 소유자로 이동할 수 있지만 내부적으로 복사 연산자를 막아놓았기 때문에 move 연산만 가능하다. *shared_ptr 레퍼런스 카운팅을 지원하는 스마트 포인터이다. 레퍼런스 카.. 2021. 12. 17.
Reader Writer Lock 구현 지금까지 공부한 Lock은 모든 작업에 대해 배타적인(한 스레드가 사용중에는 접근을 허용하지 않는) 사용방식을 사용했다. 하지만 다중 스레드 환경에서는 쓰기작업(Write)이 이루어지는 동안 읽기(Read)작업을 허용해주어야 하는 경우가 있다. 또한 동일한 스레드가 recursive lock을 수행하는 경우에도 동일한 스레드에 대해 잠궜던 영역에 대해 접근을 허용해 주어야한다. 이를 가능케 하는 Reader Writer Lock에 대해 정리해본다. Reader Writer Lock을 구현하는데에 있어서 가장 중요한 부분은 멀티 쓰레드 환경에서 Reader 스레드와 Writer 스레드를 구분하는 일이다. 해당 Lock 구현에서는 이를 해결하기 위해 lock flag를 활용한다. class Lock { en.. 2021. 12. 13.
기초적인 Lock Free Stack 구현 앞서 공부했던 CAS(Compare And Swap) 을 기반으로 Lock Free Stack을 실습해보았다. Lock Free는 커널세션의 높은 오버헤드를 가지는 mutex와 Lock을 이용하지않고 Atomic 연산을 통해 멀티스레드 환경에서 이용가능한 오브젝트를 구현하는 방법이다. Lock Free에 있어서 여러 구현 방법이 있지만 가장 기초적이고 직관적인 방법으로 만들어진 Lock Free Stack을 소개한다, 구현한 Lock Free Stack은 Push, Pop 두 가지 메인 함수를 기반으로 부수적인 헬퍼 함수들을 구현하였다. Push의 경우 크게 어려운 부분이 없으나.Pop 함수에서 멀티스레드 환경을 고려해 작업중인 타 스레드들을 고려해 할당되었던 메모리를 해제하는데 많은 고려가 필요하다. .. 2021. 12. 3.