강의에서 이해가 안되는 부분이 있습니다.
181
작성한 질문수 4
#include "pch.h"
#include "AccountManager.h"
#include "PlayerManager.h"
AccountManager GAccountManager;
void AccountManager::AccountThenPlayer()
{
WRITE_LOCK;
//GPlayerManager.Lock();
}
void AccountManager::Lock()
{
WRITE_LOCK;
}
#include "pch.h"
#include "PlayerManager.h"
#include "AccountManager.h"
PlayerManager GPlayerManager;
void PlayerManager::PlayerThenAccount()
{
WRITE_LOCK;
//GAccountManager.Lock();
}
void PlayerManager::Lock()
{
WRITE_LOCK;
}
int main() {
for (int32 i = 0; i < 1; ++i) {
GThreadManager->Launch([=] {
while (true) {
cout << "PlayerThenAccount" << endl;
GPlayerManager.PlayerThenAccount();
this_thread::sleep_for(100ms);
}
});
}
for (int32 i = 0; i < 1; ++i) {
GThreadManager->Launch([=] {
while (true) {
cout << "AccountThenPlayer" << endl;
GAccountManager.AccountThenPlayer();
this_thread::sleep_for(100ms);
}
});
}
GThreadManager->Join();
return 0;
}위에처럼 AccountManager에서 PlayerManager의 lock을 잡는 코드를 주석처리하였고 반대도 마찬가지로 주석처리 하였는대도, debug모드시 deadLock으로 처리가 되는데, 원래 이렇게 떠야하는게 맞는건가요? 이거는 데드락 상황이 아니지 않나요?
답변 2
0
네 주석 처리하셨으면 데드락으로 안 떠야 정상인데요.
제 환경에선 안 뜨는 것을 확인했고요.
정말 주석처리하고 실행해도 그렇단 말인가요? ServerCore 다시 빌드를 해보시겠어요?
그래도 발생한다면 데드락으로 탐지하는 부분에서 콜스택을 확인해서 왜 그렇게 잡혔는지를 분석해주세요.
0
안녕하세요, 인프런 AI 인턴입니다. 박건우님.
현재 작성하신 코드는 WRITE_LOCK을 사용하여 AccountManager와 PlayerManager 각각의 메서드를 잠그고 있습니다. 코드 자체로는 두 객체가 서로 다른 WRITE_LOCK을 걸고 있어 독립적으로 보호되는 것처럼 보일 수 있습니다. 그러나, 일반적으로 데드락은 두 개 이상의 스레드가 두 개의 리소스를 서로 락을 걸고 풀지 않는 상황에서 발생하게 됩니다.
아래는 이해에 도움이 될 수 있는 참고 URL입니다:
- 데드락 이해하기 - 데드락의 기초 개념과 lock_guard의 동작 방식을 설명한 답변입니다.
- 데드락의 발생 조건 - 데드락을 피하기 위한 다양한 전략을 소개한 답변입니다.
디버그 모드에서 데드락으로 인식되는 이유는 다양한 요인에 의해 좌우될 수 있습니다:
1. WRITE_LOCK 매크로가 어떠한 행위를 하는가에 따라 다르게 적용될 수 있습니다. 여러 스레드가 동일한 리소스를 독점하려 한다면 데드락으로 이어질 수 있습니다.
2. Launch 함수는 아마도 멀티스레딩 컨텍스트를 제공하고 있으며, 각 스레드가 특정 시점에서 멈춰서게 될 경우 데드락 감지가 가능한 구조일 수 있습니다.
WRITE_LOCK의 구체적인 구현이 중요한데요, 이 부분이 각 클래스 내에서 어떻게 정의되고 실행되는지 확인해보는 것이 좋습니다. 또한, 스레드 관리 및 실행의 디테일한 부분도 중요하니 여러 자료를 참고하여 스레드 동작을 살펴보시길 권장합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Memory Pool에서 오버플로우 질문입니다.
0
61
2
포토폴리오 및 진로 관련하여 고민입니다.
0
109
1
포토폴리오 관련 고민입니다.
0
59
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
80
2
성능 테스트 결과
0
101
2
게임 서버 Stateful, Stateless 진로 고민
0
118
1
WaitOnAddress와 Sleep의 차이 질문
0
81
1
궁금한거 있습니다.
0
79
2
JobTimer 구동 스레드
0
105
2
TryPop() 동작 관련 질문
0
79
1
로드맵 C#서버 C++서버 방향성 질문
0
145
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
71
1
생명주기를 위한 의도적 복사
0
83
2
락프리의 실무에서 사용 질문
0
138
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
99
2
mutex와 sleep 차이점
0
115
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
150
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
94
1
공부법 관련해서
0
181
2
MakeShared 함수 관련
0
112
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
142
2
운영체제관련 질문입니다
0
129
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
115
2
메모리 풀 질문있습니다.
0
121
1





