본문 바로가기

전체 글339

6. 데드 락 데드 락- 다중 스레드가 서로 필요로 하는 자원을 얻지 못하고 무한히 대기하는 상태 데드 락이 발생하는 4가지 조건1. 상호 배제 : 자원은 한 번에 하나의 스레드만이 사용할 수 있다. 2. 점유 대기 : 하나의 스레드가 자원을 점유한 상태에서 다른 자원을 요청하고 '대기' 3. 비선점 : 스레드가 다른 스레드의 자원을 강제로 빼앗을 수 없음 4. 순환 대기 : 여러 스레드가 자원을 점유하기 위해 서로를 기다리는 상태가 형성 데드락을 해소하기 위해서는 위 4가지 조건 중 하나를 제거하면 된다.#include #include using namespace std; mutex m1; mutex m2; void Thread_1() { for (int i = 0; i < 10000; ++i) { lock_guar.. 2023. 12. 11.
5. 스핀 락 스핀락이란?- 멀티쓰레드 환경에서 동기화를 위해 사용되는 기법 중 하나 - 임계 영역에 동시에 접근하는 것을 막기 위해 사용된다. 스핀 락의 동작 방식- 하나의 쓰레드가 임계 영역에 들어가려고 할 때 다른 쓰레드들은 스핀락을 획득하기 위해 계속 확인하고 대기한다 - 스핀락을 획득한 쓰레드가 임계 영역을 빠르게 사용하고 반환한다면 대기하던 쓰레드들은 스핀락을 획득하고 임계 영역에 접근할 수 있다. - 대기하고 확인하는 것 또한 코스트이기 때문에 임계 영역에 대한 접근이 짧고 빠른 경우에 적합하다. 스핀 락의 구현#include #include #include #include #include #include using namespace std; class Lock { public: void lock() { .. 2023. 12. 11.
4. Lock 기초 Lock에 대한 개념- atomic의 경우 특정 변수 하나에 대해서는 thread-safe하게 처리가 가능하지만 특정 범위에 대해서는 thread-safe하게 처리하려면 다른 방법을 강구해야 한다. Mutex (mutual exclusive) - 상호 배타적이라는 의미- Lock을 사용할 수 있게 해주는 클래스 - thread-safe한 구간을 만들기 위해 해당 구간의 시작부분에 lock을 걸고, 끝 부분에 unlock을 해주면 된다. 데이터 영역에 존재하는 vector v의 push_back을 멀티 스레드로 실행하면 어떤 일이 벌어질까? 결과는 크래쉬가 난다. - 왜냐하면 push_back의 동작 원리는 데이터를 집어넣고 나서 size가 capacity 이상일 경우 메모리를 다시 할당하고 기존에 있던 .. 2023. 12. 11.
3. CPU 파이프라인 및 공유 자원 CPU 파이프라인 - Fetch : 명령어를 가져온다 - Decode : 명령어를 해석한다 - Execute : 명령어를 실행한다 - Write back : 결과를 저장한다 CPU 파이프라인은 위와 같은데 유념해야 할 것은 CPU는 명령어를 받은 순서대로 처리한다는 보장이 없다 어떤 연산들의 경우 CPU가 판단해서 순서를 뒤바꾼 다음 처리하기도 한다 전역으로 a, b, r1, r2 int형 변수를 두고, 2개의 쓰레드를 만든 후 r1, r2가 0이 되지 않는 환경을 구성해서 실행했으나 위에서 언급한대로 CPU가 순서를 뒤바꾼다음 처리하여 r1, r2가 0이 되는 현상이 나타났다. CPU 뿐만 아니라 컴파일러에서도 안쓰이는 변수들이나 의미없어'보이는' 변수들의 경우 생략하는 식의 최적화를 진행하는데 vol.. 2023. 12. 11.