C++
-
C++ SpinLock구현C++/C++ 멀티스레드 2022. 10. 9. 13:44
SpinLock은 앞선 포스팅에서 말한 존버메타 lock이다. 즉, lock을 다른 스레드가 사용중이면, 그 앞에서 lock이 풀릴때까지 계속 기다리는 것이다. 이거를 한 번 구현해보자. 들어가기에 앞서, 멀티스레드 프로그래밍을 할 때는, 내가 작성한 코드를 여러 스레드가 동시에 실행한다는 것을 잊지 말아야 한다. 그러지 않으면, 왜 에러가 나는지, 왜 코드가 내가 생각한대로 되지않는지 이해하기 어려워진다. #include #include #include #include class SpinLock { public: void lock() { while(_locked){} _locked = true; } void unlock() { _locked = false; } private: bool _locked =..
-
멀티스레드 Lock구현C++/C++ 멀티스레드 2022. 10. 9. 11:21
C++에서 기본적으로 제공하는 mutex, lock_guard 등을 활용하여 멀티스레드 프로그래밍이 가능하지만, 이것들이 어떻게 구현이 되었는지 간소하게나마 알아보고 직접 구현해보려 한다. lock은 기본적으로 lock상태와 unlock상태가 있다. lock상태라면, 다른 스레드가 lock을 갖지 못하고, unlock상태라면 선착순으로 하나의 스레드에게 lock을 제공할 수 있어야 한다. 그러면 어떤 스레드가 lock을 갖고 사용하고 있을 때 다른 스레드는 lock이 필요로 한다면 어떻게 해야하는가? 저번에는 화장실을 예로 들었지만, 이번에는 헬스장을 예로 들어 보겠다. 나는 헬스를 시작한지 1년정도 되었다. 헬스장에는 피크타임이 있다. 피크타임에 가면, 인기있는 헬스기구들(랫풀다운, 벤치프레스, 스쿼트..
-
C++, 멀티스레드 교착상태(DeadLock)C++/C++ 멀티스레드 2022. 10. 8. 11:06
DeadLock은 멀티스레드 프로그래밍을 할 때 만나게 되는 대표적인 문제점 중 하나이다. DeadLock의 개념부터 알아보고 넘어가자. 각각의 스레드가 Lock을 갖고 있는데, Lock을 놓기 위해서는 다른 스레드의 Lock이 필요한 상황 을 DeadLock이라고 할 수 있을 것 같다. 사실 잘 와닿지 않을 수 있다. 적절한 예시가 될지 모르겠지만 데드락을 배우다보니 이런 상황이 생각이 났다. 고등학교를 다닐 때 우리 반 선생님은 엄한 사람이였다. 체벌이 있던 시절이다 보니, 야간자율학습을 하지 않고 도망가면 다음날에 적어도 3대씩은 맞았다. 기분에 따라서 5대까지 늘어나기도 했다. 하지만 나는 야간자율학습을 성실히 하던 학생이 아니였다. 항상 저녁을 먹고 학교에 올라와서 친구들과 도망갈까말까에 대한 ..
-
C++ 멀티스레드, lock(mutex)C++/C++ 멀티스레드 2022. 10. 6. 21:07
저번 포스팅에서는 공유데이터에 대한 동시접근으로 인해 발생하는 문제를 해결하기 위한 방법으로 atomic을 사용해봤다. 오늘은 mutex라는 lock을 사용해 보겠다. 먼저 문제가 되는 상황을 살펴보면 이번에는 C++의 컨테이너 자료형 Vector가 멀티스레드 환경에서 동시에 접근되는 상황이다. 들어가기에 앞서 vector자료형에 대해서 간단히 살펴보면 1. 가변배열 2. 벡터의 size가 capacity만큼 커지면, 2-1. 새로운 메모리공간에 기존의 1.5~2배에 해당하는 capacity를 할당받고, 2-2. 새로운 메모리공간에 기존의 메모리에 있던 값들을 복사한다. 2-3. 기존의 메모리에 있던 값들을 지운다. #include #include #include #include vector v; voi..
-
C++ 멀티스레드, AtomicC++/C++ 멀티스레드 2022. 10. 5. 23:22
멀티스레드 환경에서의 작업은 동시에 다양한 작업을 가능케 하지만, 여러가지 문제도 존재하고, 그러한 문제들이 멀티스레드 프로그래밍을 어렵게 한다. 여러가지 문제점들 중 한 가지가 공유데이터에 대한 동시접근시 발생하는 문제다. #include #include #include int sum = 0; void Add() { for (int i = 0; i < 100000; i++) { sum++; } } void Sub() { for (int i = 0; i < 100000; i++) { sum--; } } void main() { Add(); Sub(); cout