운영체제

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 공유자원

순정법사 2024.12.03

A. 공유자원

1. 공유자원실습

a. 공유자원 생성

멀티쓰레드를 공부할 떄 항상 배우는 예제가 있음

 

 

위 두개의 함수를 스레드의 자원으로 활용한 스레드를 메인에 생성해주고 

둘다 조인으로 종료, 결과값은?

 

=> 결과값이 작으면 0, 100만번 하면 ???

 

여기서 전역변수로 만들어진  sum이라는 변수가 데이터 영역에 들어감 (공유됨)

 

 

++을 의사코드로 작성하면 위와 같이되는데 

멀티스레드로 작동되고 있다고 생각하면 이해됨 (흑마법)

Sum을 공유하고 있기 때문에 코드가 동시 다발적으로 끼어드니까 이런 문제가 발생됨

 

또 지역변수인(stack 에 저장) i를 다른코드로 밀어준다면 어떻게 될까? => 밀어짐

 

b. 아토믹

 

아토믹으로 실행하면 정상적으로 작동됨

아토믹이 되면, 좀 더 복잡해지지만 다른 어셈블리어로 실행해줌

 

그럼 이제 중간에 누가 끼어들 수 없다

 

일반 정수에 비해 엄청나게 무겁기때문에 남발할 수 없고

아토믹은 하나의 클래스이기 때문에 다양한 함수를 사용할 수 있음

 

편하게 사용하고싶다면 윗버전, 아토믹타입인걸 명시하고 싶다면 아래버전 사용

 

만약  store 로 10으로 덮기 전  sum은 무슨 값일까?

원래같으면 temp지만 다른 스레드가 바꿔치기 한다면 또 달라진다

 

위와 같이 따로 빼줘서 값을 저장하게 둘 수 있음

 

아토믹하게 변해버리면 또 이런 문제가 생김

 

c. 메모리 예제

이렇게 되면 어떻게 될까?

 

New int 는  heap 메모리 (공유자원)

Heap이지만  int* 자체가  stack 영역에 있는 변수기 떄문에 

 

공유자원에 있는 heap 을 가리키는 stack에 있는 p

 

위 코드는 안전하다 ㅎㅎ (오류 없음)