JobTimer 강의 관련 질문을 드립니다.
818
작성한 질문수 2
안녕하세요. 선생님.
항상 좋은 강의를 위해 고생많으십니다.
다름이 아니라 JobTimer강의를 보던 도중 Atomic과 lock을 함께 사용하여서 TimerItem을 꺼내는 코드를 작성해주셨는데요.
아래와 같이 2가지 사항이 궁금합니다.
1. lock과 Atomic을 함께 쓰시는 경우는 특정 컨테이너에서 작업을 다 꺼내고 추가적인 작업을 할 경우, lock 점유 시간을 줄이고 싶으실 때에 Atomic을 함께 사용하시는 것이라 보면 될까요?
2. 이것이 맞다면, 보통 Atomic을 함께 써야하는 'lock 점유 시간이 긴' 작업은 어떤 기준으로 판단하시는 지가 궁금합니다.
시간내주시고 확인해주셔서 감사합니다.
답변 1
0
네 맞습니다.
기본적으로 Atomic이 더 가벼운 상황에서 사용할 수 있는데요.
(int UserCount관리라거나, bool Disconnected 등)
그러나 코드를 만들다 보면, 변수 1개를 대상으로 작업하는게 아니라
더 큰 범위에 대한 코드 동기화가 필요할 수도 있습니다.
아무리 atomic 변수라 해도 따로 따로 처리하면 안 되고
묶어서 한 방에 수정해야 하는 경우가 생길 수도 있는데
그런 경우는 Lock을 잡아야겠죠.
사실 기본적으로 atomic으로만 처리할 수 있으면 더 좋지만,
코드가 딱 한줄 (데이터 한개)만 동기화가 필요한 경우는 많이 없어
Lock까지 가야하는 상황이 거의 빈번합니다.
0
주말이신데 답변 달아주셔서 정말 감사합니다.
2번에서 질문드렸던, Atomic과 lock을 함께 써서 lock을 적게 잡아야할 정도로 민감한 작업에 대한 판단 기준도 여쭤볼 수 있을까요?
개략적으로 제가 생각하기로는 특정 컨테이너에 있는 작업을 다 꺼내서 for문을 돌아야 하는 작업이 있다면, 저런 식으로 lock을 최소화할 수 있다고 생각이 드는데, 선생님께서 이런 경우와 관련된 판단 기준이 있으시다면 듣고자 하여 여쭤봅니다.
아래는 선생님께서 작성해주신 코드입니다.
void JobTimer::Distribute(uint64 now)
{
// 한 번에 1 쓰레드만 통과
if (_distributing.exchange(true) == true)
return;
Vector<TimerItem> items;
{
WRITE_LOCK;
while (_items.empty() == false)
{
const TimerItem& timerItem = _items.top();
if (now < timerItem.executeTick)
break;
items.push_back(timerItem);
_items.pop();
}
}
for (TimerItem& item : items)
{
if (JobQueueRef owner = item.jobData->owner.lock())
owner->Push(item.jobData->job);
ObjectPool<JobData>::Push(item.jobData);
}
// 끝났으면 풀어준다
_distributing.store(false);
}
Memory Pool에서 오버플로우 질문입니다.
0
63
2
포토폴리오 및 진로 관련하여 고민입니다.
0
112
1
포토폴리오 관련 고민입니다.
0
62
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
82
2
성능 테스트 결과
0
103
2
게임 서버 Stateful, Stateless 진로 고민
0
121
1
WaitOnAddress와 Sleep의 차이 질문
0
83
1
궁금한거 있습니다.
0
82
2
JobTimer 구동 스레드
0
107
2
TryPop() 동작 관련 질문
0
81
1
로드맵 C#서버 C++서버 방향성 질문
0
148
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
73
1
생명주기를 위한 의도적 복사
0
86
2
락프리의 실무에서 사용 질문
0
139
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
101
2
mutex와 sleep 차이점
0
117
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
152
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
96
1
공부법 관련해서
0
183
2
MakeShared 함수 관련
0
114
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
144
2
운영체제관련 질문입니다
0
131
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
117
2
메모리 풀 질문있습니다.
0
124
1





