C++/C++ 멀티스레드
-
TLS(Thread Local Storage)C++/C++ 멀티스레드 2022. 11. 8. 20:47
안녕하세요. 오늘은 Thread Local Storage에 대해서 알아보겠습니다. 개념 게임을 만드는 예를 들어볼게요. 멀티스레드 환경에서 스레드들은 DB관리도 하고, 클라이언트 세션을 처리하기도 하고, 게임로직을 처리하기도 하는 등 다양한 작업을 처리하게 됩니다. 그런데, 이 스레드들은 우리가 생각하는 것처럼 이상적으로 동작하지 않습니다. 우리는 스레드가 공평하게 여러 작업에 투입되길 바라는데 현실은 한, 두개의 작업에 많은 스레드가 몰리게 됩니다. 멀티스레드 프로그래밍의 이상과 현실이라고 유명한 사진이 있습니다. 여튼 이렇게 하나의 작업에 여러 스레드가 몰리게 되면 비효율적인 상황이 발생합니다. Lock때문인데요. 멀티스레드 환경에서는 특정 작업을 처리할 때 Lock을 걸고 작업을 하는 경우가 많습니..
-
C++ future(promise, async, packaged_task)C++/C++ 멀티스레드 2022. 10. 15. 13:00
오늘은 C++의 future에 대해서 알아보겠습니다. 우리는 일반적으로 코드가 실행된다고 하면, 순차적으로 실행되는 것을 생각합니다. 1~10번까지의 코드가 있다면, 1번이 실행되고 2번이 2번이 실행되고 3번이 이렇게 말입니다. 그런데 만약 1번 명령문을 수행하는데에 아주 오랜 시간이 걸리면 어떻게 될까요? 2~10번코드는 1번 명령문이 완료되기를 기다리게 됩니다. 아주 오랜시간동안요. 하지만, 1번 명령문이 나머지 2~10번 코드에 영향을 미치는 코드가 아니라면? 1번이 반환하는 결과가 당장 필요하지 않다면? 그럴 때는 1번 명령을 어떤 스레드에게 맡겨놓고, 1번 명령이 완료되기 전에, 나머지 2~10번을 수행할 수 있을것입니다. 그리고, 이 때 1번 명령의 결과값을 저~기 7이나 8번즈음에서 받기 ..
-
C++ Conditional Variable(조건변수)C++/C++ 멀티스레드 2022. 10. 14. 12:54
C++표준에서 제공하는 Conditional Variable을 이용하면 멀티스레드간 동기화를 구현할 수 있습니다. 조건변수를 사용하는 대표적인 패턴인 생산자-소비자 패턴을 예시로 들어보겠습니다. #include #include #include #include #include queue q; mutex m; void Producer() { while (true) { { unique_lock lock(m); int pushData = rand() % 100; q.push(pushData); cout
-
C++ 멀티스레드 동기화, 이벤트 사용법C++/C++ 멀티스레드 2022. 10. 12. 20:38
저번 시간까지 멀티스레드 환경에서 lock을 기다릴 때 사용할 수 있는 방법으로 두 가지를 알아보았습니다. 1. spinlock(무한정대기) 2. sleep(랜덤한 시간동안 대기) 이번에는 3번째 방법인 이벤트를 사용하는 방법에 대해서 알아보도록 하겠습니다. 저번에 들었던 헬스장 예시를 다시 들어볼게요. 사용하고 싶은 헬스기구를 다른 사람이 사용하고 있다. 나는 헬스기구에 자리가 나면 사용할 예정이다. 1. spinlock은 기구 뒤에서서 무작정 기다리는 방법이고 2. sleep은 일정시간동안 다른 곳에서 기다리다가 자리가 났는지 확인하는 방법입니다. 세 번째방법인 이벤트 방법은 이런겁니다. 어이~ 김비서! 나 밖에서 쉬고있을테니까 여기 자리나면 나한테 알려줘! 이 개념을 C++에서 나타내면 다음과 같이..
-
C++, Sleep을 이용한 Lock구현C++/C++ 멀티스레드 2022. 10. 10. 11:52
이전 포스팅에서는 spinlock을 구현해봤다. spinlock은 lock을 얻기위해서, 기한없는 대기를 하는 방법이다. https://bethetitan.tistory.com/9 C++ SpinLock구현 SpinLock은 앞선 포스팅에서 말한 존버메타 lock이다. 즉, lock을 다른 스레드가 사용중이면, 그 앞에서 lock이 풀릴때까지 계속 기다리는 것이다. 이거를 한 번 구현해보자. 들어가기에 앞서, 멀티스 bethetitan.tistory.com spinlock을 이용할 경우, CPU를 더 효율적인 곳에 사용하지 못하고, 가만히 놀게 하는 것과 다름없으므로, lock을 가진, thread가 lock을 빨리 해제하지 않는 경우에는 비효율적이라는 단점이 있다. 그래서 오늘은 lock이 잠겨있다면,..
-
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대까지 늘어나기도 했다. 하지만 나는 야간자율학습을 성실히 하던 학생이 아니였다. 항상 저녁을 먹고 학교에 올라와서 친구들과 도망갈까말까에 대한 ..