SlideShare a Scribd company logo
1 of 40
한국산업기술대학교 게임공학부
정내훈 (nhjung 골뱅이 kpu.ac.kr)
멀티스레딩과 shared_ptr 의 충돌
해결
부제 : shared_ptr 에 낚이지 마세요 .
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
강사 소개
•현재 : 한국산업기술대학교 게임공학부 부교
수
• 게임서버 프로그래밍 , 멀티코어 프로그래밍
•게임 제작 이력
• NCSOFT
• Lineage Forever(MMO), Alterlife(MMO), Team BL
(Blade & Soul, MMO), 게임서버 & 물리엔진 연동
• 넷마블 ( 공동연구 )
• 글로벌 모바일 서버 연구 , FPS Game 서버 리모델링 ,
리니지 2 레볼루션 (MMO) 서버 안정화
강사 소개
•NDC 발표
• [NDC12] 멀티 쓰레드 프로그래밍이 왜 이리 힘드나요
?
• ( 컴파일러와 하드웨어에서 Lock-free 알고리즘 까지 )
• [NDC14] 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리
힘드나요 ?
• (Lock-free 에서 Transactional Memory 까지 )
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
도입
•멀티스레드 프로그래밍
•모던 C++
• C++11 / C++14 / C++17 / C++20
•shared_ptr
멀티스레드 프로그래밍
•피할 수 없다
• CPU 가 느리기 때문
•어렵다
• 소스코드에서 디버거로 해결이 안되는 문제들이 있다 .
• [NDC12] 발표 참조
• 성능향상이 힘들다
• Lock-free 를 동원해야 한다 . [NDC14] 발표 참조
모던 C++
•실제 게임 구현에 많이 사용되고 있다 .
• 사용하지 않을 이유가 없다 .
•생산성 향상
• auto, lambda, for (a : b) …
•표준
• 멀티스레딩 / 네트워킹 코드의 표준
• Visual Studio 나 g++ 이나 같은 코드
SHARED_PTR
•shared_ptr 가 무엇인지 알고 계신 분 ?
• weak_ptr 가 무엇인지 알고 계신 분 ?
•shared_ptr 를 사용하고 계신 분 ?
•shared_ptr 를 멀티스레드에서 사용하고 계신
분 ?
SHARED_PTR
•원래 용도
• delete 누락으로 인한 메모리 leak 방지
•멀티쓰레드에서의 재발견
• 메모리 Life Cycle 문제의 나이스한 해결책
• new 로 할당 받은 자료구조를 여러 스레드에서 공유할 때
참조 중인 객체가 불시에 delete 당하는 것을 막아줌
• 다른 쓰레드가 참고하고 있지 않은 것을 확인하면서 delete
하는 골치 아픔을 없앰
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
문제
•shared_ptr 는 멀티스레드에서 사용하라고 만
들어진 자료구조로 보인다 . 정말 ?
문제
•뒤에 있는 주의사항은 왜 다들 무시하는가 ?
If multiple threads of execution access the same
shared_ptr without synchronization and any of those
accesses uses a non-const member function of
shared_ptr then a data race will occur; the
shared_ptr overloads of atomic functions can be used
to prevent the data race.
이것과는 관계 없습니
다 .
문제
•뒤에 있는 주의사항은 왜 다들 무시하는가 ?
•실제로 주의 하지 않고 사용되었던 사례들이
있음 .
•판사님 저는 아무 말도 하지 않았습니다 .
정말 ?
• 간단한 예제
정말 ?
• 결과
• ERROR!
• CPU 에 따라
서는 Crash
결론
•shared_ptr 의 대상에 접근하는 것은 thread
safe 하다 .
• 접근만 ! 대상 자체는 다른 문제 !!
•하지만 공유 shared_ptr 변수의 접근
(load, store) 은 thread safe 하지 않다 .
• local shared_ptr 변수의 사용은 항상 안전하다 .
• local shared_ptr 가 가리키는 객체가 shared 일 경우에도
왜 ?
•shared_ptr 변수의 접근은 thread safe 하지
않다 .
•[ 증거 ] (visual studio 2015, release mode)shared_ptr<int> temp;
00AD11F0 mov dword ptr [ebp-4],0
temp = g_ptr;
00AD11F7 mov esi,dword ptr ds:[0AD54D4h]
00AD11FD mov eax,dword ptr [g_ptr (0AD54D0h)]
00AD1202 test esi,esi
00AD1204 je thread1+4Ah (0AD120Ah)
00AD1206 lock inc dword ptr [esi+4]
00AD120A mov dword ptr [ebp-10h],esi
00AD120D mov dword ptr [temp],eax
00AD1210 mov byte ptr [ebp-4],0
if (1 != *temp) cout << "Errorn";
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
해결책
1. <atomic> 을 사용한다 .
2. atomic_shared_ptr 를 구해서 사용한다 .
3. atomic_shared_ptr 를 제작한다 .
해결책
•<atomic> 을 사용한다 ??
atomic<shared_ptr<int>> value;
https://namu.wiki/w/%EA%B7%B8%EB%9F%B0%20%EA%B1%B0%EB%8A%94%20%EC
%9A%B0%EB%A6%AC%ED%95%9C%ED%85%8C%EB%8A%94%20%EC%9E%88%EC
%9D%84%20%EC%88%98%EA%B0%80%20%EC%97%86%EC%96%B4
해결책
•<atomic> 을 사용한
다 .
• 장점 : 깔끔한 구현 ,
성능 페널티가 없을 수
도…
• 단점 : 깜빡하고 그냥
assign 하는 경우가 있
다 .
해결책
• 구현된 atomic_shared_ptr 를 사용한다 .
• 표준이 존재 http://isocpp.org/files/papers/N4162.pdf
• 장점 : 직관적인 사용가능 , Lock-free
• 단점 : 아직 없다 .
해결책
• atomic_shared_ptr 를 사용한다 .
• 장점 : 직관적인 사용가능 , Lock-free
• 단점 : 아직 없다 .
http://fun.jjang0u.com/chalkadak/view?
db=160&no=108699
해결책
•현기증나는분 급한분들을 위해
• 구매한다 .
• 조금만 더 기다린다 .
https://www.justsoftwaresolutions.co.uk/
https://www.linkedin.com/pulse/multithreading-c17-c20-rainer-grimm
해결책
•atomic_shared_ptr
를 제작한다 .
• 장점 : 직관적인 사용
가능
• 단점 : Lock-free 가 아
니다 .
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
WEAK_PTR
•shared_ptr 만으로는 모든 경우를 커버할 수 없다 .
•메모리 leak 을 피하기 위해서는 weak_ptr 가 필요
하다 .
• 자식이 부모를 pointing 해야 할 경우 !!!
•weak_ptr 도 shared_ptr 와 같이 atomic_weak_ptr
를 사용해야 한다 .
WEAK_PTR
•weak_ptr::lock() 을 어떻게 atomic 하게 하지 ????
• atomic_load() 사용
• 구현된 atomic_weak_ptr 사용
• 내부적으로 mutex 사용
• atomic_weak_ptr 자체 구현
• 내부적으로 mutex 사용
WEAK_PTR
WEAK_PTR
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
성능 ?
•atomic_load()? atomic_exchange()?
• Visual Studio 2015 의 내부 구현
• 글로벌 Lock 을 걸어버리는 만행 !
template<class _Ty> inline
shared_ptr<_Ty> atomic_load_explicit(const shared_ptr<_Ty> *_Ptr,
memory_order)
{// load *_Ptr atomically
_Shared_ptr_spin_lock _Lock;
shared_ptr<_Ty> _Result = *_Ptr;
return (_Result);
}
성능 ?
•atomic_load()? atomic_exchange()?
•mutex 를 사용한 자체 구현
성능 ?
• 그럼 JSS 는 ?
JSS
자체구현
Contents
1. 강사 소개
2. 도입
3. 문제
4. 해결책
5. weak_ptr
6. 성능
7. 결론
결론
•shared_ptr 는 절대로 멀티쓰레드 safe 가 아니다 .
•atomic_shared_ptr 를 사용하자 .
• 구매 또는 C++20 까지 참기
• mutex 를 통한 자체 구현
• weak_ptr 까지 set 로 구현 필요
• lock-free 자체 구현
• 연구비만 주시면…
•성능에 신경 쓰자
• 가능하면 사용 빈도를 줄이고 , copy 대신 reference 를 사용
참조
•mutex 구현과 벤치마크프로그램
• https://drive.google.com/drive/folders/0B_q-ByE4opaId2dIL
• 완벽한 검증은 사용자의 몫 ( 연구비 필요… )
Thank You.
광고 : 멀티스레드 서버의 안정화와
성능향상에 관심있는 기업은 연락 바람
.
QnA

More Related Content

What's hot

실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가Seungmo Koo
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception상현 조
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요NAVER D2
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCPSeungmo Koo
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지강 민우
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기YEONG-CHEON YOU
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...Amazon Web Services Korea
 

What's hot (20)

실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 

Similar to Multithread & shared_ptr

임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011devCAT Studio, NEXON
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programmingByeongsu Kang
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈NAVER D2
 
Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용Youngjae Kim
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 
오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼Kenu, GwangNam Heo
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면Byeongsu Kang
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
하루에 10번 배포하기 - flickr
하루에 10번 배포하기 - flickr하루에 10번 배포하기 - flickr
하루에 10번 배포하기 - flickrSeongSik Kim
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15Chanwoong Kim
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhudMinGeun Park
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018Shengzhe Li
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요? 내훈 정
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programmingJaejin Yun
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 
하드웨어 스타트업의 소프트웨어 이야기
하드웨어 스타트업의 소프트웨어 이야기하드웨어 스타트업의 소프트웨어 이야기
하드웨어 스타트업의 소프트웨어 이야기Mijeong Park
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템Young Soo Kim
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...hoondong kim
 
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GDG Korea
 

Similar to Multithread & shared_ptr (20)

임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 
오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
하루에 10번 배포하기 - flickr
하루에 10번 배포하기 - flickr하루에 10번 배포하기 - flickr
하루에 10번 배포하기 - flickr
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 
하드웨어 스타트업의 소프트웨어 이야기
하드웨어 스타트업의 소프트웨어 이야기하드웨어 스타트업의 소프트웨어 이야기
하드웨어 스타트업의 소프트웨어 이야기
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
 

Recently uploaded

[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and AdoptionSeung-chan Baeg
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'Hyundai Motor Group
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Wonjun Hwang
 

Recently uploaded (7)

[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 

Multithread & shared_ptr

  • 1. 한국산업기술대학교 게임공학부 정내훈 (nhjung 골뱅이 kpu.ac.kr) 멀티스레딩과 shared_ptr 의 충돌 해결 부제 : shared_ptr 에 낚이지 마세요 .
  • 2. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 3. 강사 소개 •현재 : 한국산업기술대학교 게임공학부 부교 수 • 게임서버 프로그래밍 , 멀티코어 프로그래밍 •게임 제작 이력 • NCSOFT • Lineage Forever(MMO), Alterlife(MMO), Team BL (Blade & Soul, MMO), 게임서버 & 물리엔진 연동 • 넷마블 ( 공동연구 ) • 글로벌 모바일 서버 연구 , FPS Game 서버 리모델링 , 리니지 2 레볼루션 (MMO) 서버 안정화
  • 4. 강사 소개 •NDC 발표 • [NDC12] 멀티 쓰레드 프로그래밍이 왜 이리 힘드나요 ? • ( 컴파일러와 하드웨어에서 Lock-free 알고리즘 까지 ) • [NDC14] 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요 ? • (Lock-free 에서 Transactional Memory 까지 )
  • 5. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 6. 도입 •멀티스레드 프로그래밍 •모던 C++ • C++11 / C++14 / C++17 / C++20 •shared_ptr
  • 7. 멀티스레드 프로그래밍 •피할 수 없다 • CPU 가 느리기 때문 •어렵다 • 소스코드에서 디버거로 해결이 안되는 문제들이 있다 . • [NDC12] 발표 참조 • 성능향상이 힘들다 • Lock-free 를 동원해야 한다 . [NDC14] 발표 참조
  • 8. 모던 C++ •실제 게임 구현에 많이 사용되고 있다 . • 사용하지 않을 이유가 없다 . •생산성 향상 • auto, lambda, for (a : b) … •표준 • 멀티스레딩 / 네트워킹 코드의 표준 • Visual Studio 나 g++ 이나 같은 코드
  • 9. SHARED_PTR •shared_ptr 가 무엇인지 알고 계신 분 ? • weak_ptr 가 무엇인지 알고 계신 분 ? •shared_ptr 를 사용하고 계신 분 ? •shared_ptr 를 멀티스레드에서 사용하고 계신 분 ?
  • 10. SHARED_PTR •원래 용도 • delete 누락으로 인한 메모리 leak 방지 •멀티쓰레드에서의 재발견 • 메모리 Life Cycle 문제의 나이스한 해결책 • new 로 할당 받은 자료구조를 여러 스레드에서 공유할 때 참조 중인 객체가 불시에 delete 당하는 것을 막아줌 • 다른 쓰레드가 참고하고 있지 않은 것을 확인하면서 delete 하는 골치 아픔을 없앰
  • 11. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 12. 문제 •shared_ptr 는 멀티스레드에서 사용하라고 만 들어진 자료구조로 보인다 . 정말 ?
  • 13. 문제 •뒤에 있는 주의사항은 왜 다들 무시하는가 ? If multiple threads of execution access the same shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur; the shared_ptr overloads of atomic functions can be used to prevent the data race. 이것과는 관계 없습니 다 .
  • 14. 문제 •뒤에 있는 주의사항은 왜 다들 무시하는가 ? •실제로 주의 하지 않고 사용되었던 사례들이 있음 . •판사님 저는 아무 말도 하지 않았습니다 .
  • 16. 정말 ? • 결과 • ERROR! • CPU 에 따라 서는 Crash
  • 17. 결론 •shared_ptr 의 대상에 접근하는 것은 thread safe 하다 . • 접근만 ! 대상 자체는 다른 문제 !! •하지만 공유 shared_ptr 변수의 접근 (load, store) 은 thread safe 하지 않다 . • local shared_ptr 변수의 사용은 항상 안전하다 . • local shared_ptr 가 가리키는 객체가 shared 일 경우에도
  • 18. 왜 ? •shared_ptr 변수의 접근은 thread safe 하지 않다 . •[ 증거 ] (visual studio 2015, release mode)shared_ptr<int> temp; 00AD11F0 mov dword ptr [ebp-4],0 temp = g_ptr; 00AD11F7 mov esi,dword ptr ds:[0AD54D4h] 00AD11FD mov eax,dword ptr [g_ptr (0AD54D0h)] 00AD1202 test esi,esi 00AD1204 je thread1+4Ah (0AD120Ah) 00AD1206 lock inc dword ptr [esi+4] 00AD120A mov dword ptr [ebp-10h],esi 00AD120D mov dword ptr [temp],eax 00AD1210 mov byte ptr [ebp-4],0 if (1 != *temp) cout << "Errorn";
  • 19. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 20. 해결책 1. <atomic> 을 사용한다 . 2. atomic_shared_ptr 를 구해서 사용한다 . 3. atomic_shared_ptr 를 제작한다 .
  • 21. 해결책 •<atomic> 을 사용한다 ?? atomic<shared_ptr<int>> value; https://namu.wiki/w/%EA%B7%B8%EB%9F%B0%20%EA%B1%B0%EB%8A%94%20%EC %9A%B0%EB%A6%AC%ED%95%9C%ED%85%8C%EB%8A%94%20%EC%9E%88%EC %9D%84%20%EC%88%98%EA%B0%80%20%EC%97%86%EC%96%B4
  • 22. 해결책 •<atomic> 을 사용한 다 . • 장점 : 깔끔한 구현 , 성능 페널티가 없을 수 도… • 단점 : 깜빡하고 그냥 assign 하는 경우가 있 다 .
  • 23. 해결책 • 구현된 atomic_shared_ptr 를 사용한다 . • 표준이 존재 http://isocpp.org/files/papers/N4162.pdf • 장점 : 직관적인 사용가능 , Lock-free • 단점 : 아직 없다 .
  • 24. 해결책 • atomic_shared_ptr 를 사용한다 . • 장점 : 직관적인 사용가능 , Lock-free • 단점 : 아직 없다 . http://fun.jjang0u.com/chalkadak/view? db=160&no=108699
  • 25. 해결책 •현기증나는분 급한분들을 위해 • 구매한다 . • 조금만 더 기다린다 . https://www.justsoftwaresolutions.co.uk/ https://www.linkedin.com/pulse/multithreading-c17-c20-rainer-grimm
  • 26. 해결책 •atomic_shared_ptr 를 제작한다 . • 장점 : 직관적인 사용 가능 • 단점 : Lock-free 가 아 니다 .
  • 27. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 28. WEAK_PTR •shared_ptr 만으로는 모든 경우를 커버할 수 없다 . •메모리 leak 을 피하기 위해서는 weak_ptr 가 필요 하다 . • 자식이 부모를 pointing 해야 할 경우 !!! •weak_ptr 도 shared_ptr 와 같이 atomic_weak_ptr 를 사용해야 한다 .
  • 29. WEAK_PTR •weak_ptr::lock() 을 어떻게 atomic 하게 하지 ???? • atomic_load() 사용 • 구현된 atomic_weak_ptr 사용 • 내부적으로 mutex 사용 • atomic_weak_ptr 자체 구현 • 내부적으로 mutex 사용
  • 32. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 33. 성능 ? •atomic_load()? atomic_exchange()? • Visual Studio 2015 의 내부 구현 • 글로벌 Lock 을 걸어버리는 만행 ! template<class _Ty> inline shared_ptr<_Ty> atomic_load_explicit(const shared_ptr<_Ty> *_Ptr, memory_order) {// load *_Ptr atomically _Shared_ptr_spin_lock _Lock; shared_ptr<_Ty> _Result = *_Ptr; return (_Result); }
  • 35. 성능 ? • 그럼 JSS 는 ? JSS 자체구현
  • 36. Contents 1. 강사 소개 2. 도입 3. 문제 4. 해결책 5. weak_ptr 6. 성능 7. 결론
  • 37. 결론 •shared_ptr 는 절대로 멀티쓰레드 safe 가 아니다 . •atomic_shared_ptr 를 사용하자 . • 구매 또는 C++20 까지 참기 • mutex 를 통한 자체 구현 • weak_ptr 까지 set 로 구현 필요 • lock-free 자체 구현 • 연구비만 주시면… •성능에 신경 쓰자 • 가능하면 사용 빈도를 줄이고 , copy 대신 reference 를 사용
  • 38. 참조 •mutex 구현과 벤치마크프로그램 • https://drive.google.com/drive/folders/0B_q-ByE4opaId2dIL • 완벽한 검증은 사용자의 몫 ( 연구비 필요… )
  • 40. 광고 : 멀티스레드 서버의 안정화와 성능향상에 관심있는 기업은 연락 바람 . QnA