묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요! Pessimistic lock 관련 질문이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 강사님!우선 좋은 강의 만들어주신 점 감사드립니다.다름이 아니라 강의에서 소개해주신대로 Pessimistic lock을 적용해서테스트 코드를 돌리는데 다음과 같은 에러가 떠서요 ㅜㅜ혹시 해결책에 대해 질문드려도 괜찮을까요?감사합니다!
-
미해결테스트주도개발(TDD)로 만드는 NodeJS API 서버
package-lock 파일은 어떤 용도일까요?
npm init 을 하게 되면 package / package-lock 두개가 생기는데 이 두개를 모두 들고 다녀야하는 것인지, 아니면 package 만 들고 다녀도 되는 것인지 궁금합니다. package 만 들도 다녀도 된다고 하면 lock 파일은 어떤 용도로 존재하는걸까요?
-
미해결[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: 게임 서버
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을 걸어주는게 좋을것 같다고 생각했는데 걸지 않아도 괜찮은건가요? 걸어주는게 맞는건가요? 혹시 제가 놓쳤거나 틀린 부분있으면 알려주시면 감사하겠습니다!! 감사합니다!!