SlideShare a Scribd company logo
한국산업기술대학교 게임공학부
정내훈 (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
Ad

More Related Content

What's hot (20)

임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
Brian Hong
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
ChangKyu Song
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
ChangKyu Song
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
Seungmo Koo
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
Seungmo Koo
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
YEONG-CHEON YOU
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
Hyunjik Bae
 
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
Hyunsuk Ahn
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
NAVER D2
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
Brian Hong
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
ChangKyu Song
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
ChangKyu Song
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
Seungmo Koo
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
Seungmo Koo
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
YEONG-CHEON YOU
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
Hyunjik Bae
 
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
Hyunsuk Ahn
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
NAVER D2
 

Similar to Multithread & shared_ptr (20)

임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
devCAT Studio, NEXON
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu 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-2
NAVER 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번 배포하기 - flickr
SeongSik Kim
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
Chanwoong Kim
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
MinGeun Park
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
Shengzhe Li
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
Jaejin 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
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
devCAT Studio, NEXON
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu 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-2
NAVER 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번 배포하기 - flickr
SeongSik Kim
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
Chanwoong Kim
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
MinGeun Park
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
Shengzhe Li
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
Jaejin 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
 
Ad

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