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

More Related Content

PDF
Windows Registered I/O (RIO) vs IOCP
PDF
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
PDF
중앙 서버 없는 게임 로직
PDF
MMOG Server-Side 충돌 및 이동처리 설계와 구현
PDF
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
PDF
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
PDF
임태현, 게임 서버 디자인 가이드, NDC2013
PDF
NDC12_Lockless게임서버설계와구현
Windows Registered I/O (RIO) vs IOCP
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
중앙 서버 없는 게임 로직
MMOG Server-Side 충돌 및 이동처리 설계와 구현
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
임태현, 게임 서버 디자인 가이드, NDC2013
NDC12_Lockless게임서버설계와구현

What's hot (20)

PDF
Iocp 기본 구조 이해
PDF
실시간 게임 서버 최적화 전략
PDF
Iocp advanced
PDF
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
PPTX
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
PDF
Multiplayer Game Sync Techniques through CAP theorem
PDF
테라로 살펴본 MMORPG의 논타겟팅 시스템
PDF
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
PPTX
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
PPTX
Windows system - memory개념잡기
PPTX
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
PPTX
Ndc14 분산 서버 구축의 ABC
PDF
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
PDF
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
PPTX
NDC 11 자이언트 서버의 비밀
PDF
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
PDF
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
PPTX
게임 분산 서버 구조
PDF
게임서버프로그래밍 #1 - IOCP
PDF
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
Iocp 기본 구조 이해
실시간 게임 서버 최적화 전략
Iocp advanced
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
Multiplayer Game Sync Techniques through CAP theorem
테라로 살펴본 MMORPG의 논타겟팅 시스템
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
Windows system - memory개념잡기
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
Ndc14 분산 서버 구축의 ABC
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
NDC 11 자이언트 서버의 비밀
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
게임 분산 서버 구조
게임서버프로그래밍 #1 - IOCP
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
Ad

Similar to Multithread & shared_ptr (20)

PDF
Effective modern cpp item18, 19
PPTX
Effective c++(chapter3,4)
PDF
[C++ korea] effective modern c++ study item 17 19 신촌 study
PPTX
Api design for c++ pattern
PPTX
Api design for c++ ch3 pattern
PDF
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
PDF
Microsoft pp lpdf
PDF
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
PDF
[NDC2016] TERA 서버의 Modern C++ 활용기
PPTX
면접 대비 벡터, CS 개념과 사례
PDF
Concurrency in action - chapter 7
PDF
More effective c++ chapter4 이후 항목 29까지
PDF
Concurrency in action - chapter 5
PPTX
Effective c++ 2
PDF
MutiCore 19-20
PPTX
Ec++ 3,4 summary
PPTX
Effective c++chapter3
PDF
242 naver-2
PDF
Effective C++ Chapter 3 Summary
PPTX
C++ 11 에 대해서 쉽게 알아봅시다 1부
Effective modern cpp item18, 19
Effective c++(chapter3,4)
[C++ korea] effective modern c++ study item 17 19 신촌 study
Api design for c++ pattern
Api design for c++ ch3 pattern
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
Microsoft pp lpdf
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[NDC2016] TERA 서버의 Modern C++ 활용기
면접 대비 벡터, CS 개념과 사례
Concurrency in action - chapter 7
More effective c++ chapter4 이후 항목 29까지
Concurrency in action - chapter 5
Effective c++ 2
MutiCore 19-20
Ec++ 3,4 summary
Effective c++chapter3
242 naver-2
Effective C++ Chapter 3 Summary
C++ 11 에 대해서 쉽게 알아봅시다 1부
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