분류 전체보기
-
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