묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send lock 관련 질문
public void Send(byte[] sendBuff) { lock (_lock) { _sendQueue.Enqueue(sendBuff); if (_pendingList.Count == 0) RegisterSend(); } } void OnSendCompleted(object sender, SocketAsyncEventArgs args) { lock (_lock) { if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success) { try { _sendArgs.BufferList = null; _pendingList.Clear(); // Doing if (_sendQueue.Count > 0) RegisterSend(); } catch (Exception e) { Console.WriteLine($"OnSendCompleted Failed {e}"); } } } }수업을 들으면서 Send와 OnSendCompleted에 lock이 서로 다른 두개이상의 쓰레드가 동시에 sendQueue, pendingList에 Write하는 것을 방지하는 것이라고 이해했습니다.그리고 Send의 if문이 다른 쓰레드가 전송중일때를 체크하는 것이라고 들었는데 저 2개의 lock구조에서, 쓰레드A가 OnSendCompleted의 lock구역안에 있을 때 쓰레드B가 Send의 lock구역에 진입이 가능한지 궁금합니다.만약 접근이 안된다면 pendingList.Count가 항상 0이 되지않을까 생각하고 있습니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요! Pessimistic lock 관련 질문이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 강사님!우선 좋은 강의 만들어주신 점 감사드립니다.다름이 아니라 강의에서 소개해주신대로 Pessimistic lock을 적용해서테스트 코드를 돌리는데 다음과 같은 에러가 떠서요 ㅜㅜ혹시 해결책에 대해 질문드려도 괜찮을까요?감사합니다!
-
미해결테스트주도개발(TDD)로 만드는 NodeJS API 서버
package-lock 파일은 어떤 용도일까요?
npm init 을 하게 되면 package / package-lock 두개가 생기는데 이 두개를 모두 들고 다녀야하는 것인지, 아니면 package 만 들고 다녀도 되는 것인지 궁금합니다. package 만 들도 다녀도 된다고 하면 lock 파일은 어떤 용도로 존재하는걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock과 interupt관련 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1. 만약 A thread에서 오래걸리는 함수에 mutex lock을 잡아두고 time slice나 각종 인터럽트 핸들링을 통해서 컨텍스트 스위치가 일어나게 되고, 다른 모든 쓰레드가 A thread가 lock 잡아둔 그 함수 내부의 공유변수를 갖다 쓰고 싶어서 mutex_lock.lock()을 호출하기 위해 기다리는 상황이라면, OS 스케쥴러를 통해서 리소스가 넘어가도 모든 다른 쓰레드가 mutex_lock.lock()이 되지 않아 cpu 리소스를 받자 마자 바로 yield하고 A thread로 다시 돌아오게 되는건가요? 2. (1과 비슷한 질문이긴 하지만..궁금해서요ㅠㅠ) spin lock이 아닌 그냥 mutex lock을 썼을 때, B라는 다른 thread가 해당 mutex 변수를 가지고 lock 걸었으면, A thread는 mutex_lock.lock()을 호출하는 구문을 실행하는 부분에서 바로 cpu리소스를 반환하게 되나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
lock lock-free 성능 차이가 없다는 부분에 대하여
강의 하실때 lock방식과 lock-free방식에 성능 차이가 없다는 것처럼 이야기 하셔서, 왜 성능 차이가 없을까 라는 것을 생각 해 보면, 주로 성능 차이가 어디에서 오냐를 먼저 고민해 봐야 할 것입니다. 저의 생각으로는, 정상적인 상황에서 Context switching으로 인해 커널 - 유저 모드 전환에서 큰 비용이 발생한다고 생각이 됩니다. 전통적인 Event 방식이 대표적인 예라고 생각합니다. 작업하신 lock-free 방식을 볼때마다 spinlock이 계속 떠올랐습니다. 결국 User mode에서 polling하고 있는 것이 겠지요. 어디서 주워 듣기로는 요즘 lock들도 커널 모드로 바로 들어가 일정시간 잠들지 않고, user mode에서 3000번, 5000번 정도 while을 돌면서 소유권을 얻을 수 있는지 확인한다고 합니다. 그 횟수동안 얻지 못하면 sleep 되는 식으로 알고 있습니다. 결국 빠르게 소유권이 전환되는 상황이라면 user mode에서만 작업이 발생하기 때문에 큰 overhead가 없다고 볼 수 있을 것 같습니다. 이러한 이유로 두 방식의 성능 차이가 거의 없다고 보는데 다른 분들의 의견이 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
FastLock에 대해 질문있습니다.
궁금증이 생겨서 그런데.. 강의에서 언급해 주신 FastLock의 좀 더 상세한 동작코드를 github등에 공유해주실 수 있으실까요? 아니면 수도코드나 좀 더 자세한 동작방식이 궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom class에서는 lock을 사용하지 않아도 멀티스레드 환경에서 안전할까요?
안녕하세요 Rookiss님! 양질의 강의를 제공해주셔서 정말 감사드립니다! 질문) GameRoom class에서는 lock을 사용하지 않아도 멀티스레드 환경에서 안전할까요? public void Flush() { foreach (ClientSession s in _sessions) s.Send(_pendingList); //Console.WriteLine($"Flushed {_pendingList.Count} items"); _pendingList.Clear(); } public void Broadcast(ArraySegment<byte> segment) { _pendingList.Add(segment); } 제 생각에 lock을 사용하지 않으면 _pendingList가 Clear되기 직전에 추가된 segment는 Send되지 못하고 삭제당하는 등 올바르지 못하게 동작하는 상황이 발생할 수 있을것 같았습니다. (Flush method는 main Thread, BroadCast method는 background Thread. 서로 다른 Thread에서 동작한다고 생각했습니다.) public void Flush() { lock(_lock) { foreach (ClientSession s in _sessions) s.Send(_pendingList); //Console.WriteLine($"Flushed {_pendingList.Count} items"); _pendingList.Clear(); } } public void Broadcast(ArraySegment<byte> segment) { lock(_lock) { _pendingList.Add(segment); } } 그래서 위처럼 lock을 걸어주는게 좋을것 같다고 생각했는데 걸지 않아도 괜찮은건가요? 걸어주는게 맞는건가요? 혹시 제가 놓쳤거나 틀린 부분있으면 알려주시면 감사하겠습니다!! 감사합니다!!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session #2 강의 _pending 변수 질문입니다.
안녕하세요! 정말 이만한 게임서버에 관한 강의가 없는데 감사히 수강하고있습니다! Session #2 강의 보다가 질문을 올립니다. 아직 Session #2까지밖에 안봐서 인지는 모르지만 _pending으로 분기처리를 하는 부분이 왜 필요한지 모르겠습니다. 이미 _lock으로 들어왔으면 다른스레드는 못들어올 텐데 _pending으로 한번 더 분기해서 큐에만 넣고 빠져나올지 아니면 `RegisterSend`까지 해줄지를 결정하는 부분입니다. _lock에 들어오고 다른 쓰레드가 _pending으로 분기할 경우가 있을지 제 눈에는 도저히 판별하기가 힘드네요 ㅠㅠ 그런 경우가 생기나요?? 우선 _pending의 추가적인 분기없이 실행해도 정상작동합니다! 감사합니다!