게임 서버17 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. 2. 멀티 쓰레드 실습 #include #include #include using namespace std; void HelloThread(int i) { cout 2023. 12. 11. 이전 1 2 3 4 5 다음