인프런 커뮤니티 질문&답변

GODOT님의 프로필 이미지
GODOT

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

JobTimer

32:55초 질문 있습니다.

작성

·

243

0

32:55초 

28째줄 (jobtimer.cpp 궁금한게 있습니다.)

28번째 줄에 WRITE_LOCK 하기전에 중괄호를 쳤는데

어떤 상황에 의해 LOCK 잡은 곳(괄호)을 지나서 

 

그 괄호 밖의 for문이 실행될 수 있다는 말인가요?

그래서 _distributing 으로 막는거라 이해 하면 되는건가요?

괄호가 없음 상관이 없을까요?

 

 

 

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

멀티쓰레드 환경이라면 같은 함수를
여러 쓰레드가 막 동시에 호출할 수도 있는데요.
어떤 쓰레드에서 함수 흐름대로 쭉 실행해서 LOCK을 지나치게 아래부분을 실행하는데
다른 쓰레드가 동시에 실행되면 LOCK 관련 부분을 실행하고 있을 수 있겠죠.
전체 LOCK을 잡으면 이 문제는 해결되지만
대신 한 애가 실행할 때 다른 애들은 아예 실행을 못하고 대기하게 됩니다.

GODOT님의 프로필 이미지
GODOT
질문자

아 제가 궁금한점이 { } 괄호를 기준으로 Lock 잡히는 건지 lock 잡은 부분부터 --- 함수의 } 괄호가 보일때까지 잡힌건지

잘 모르겠어서 질문드렸네요. 찾아보니 {} 괄호기준(scope)으로 잡히는것 같은데 맞는가요?

 

아 해보니깐 괄호기준이 맞네요.,

2번 들으려고 계속 눈팅만 했더니...

void Add() {

{

lock_guard<mutex> guard(m);

for (int i = 0; i < 10; ++i) {

sum++;

cout << "a : " << sum << endl;

}

}

 

for (int i = 0; i < 20; ++i) {

sum++;

cout << "c : " << sum << endl;

}

}

 

void Sub() {

{

lock_guard<mutex> guard(m);

for (int i = 0; i < 10; ++i) {

sum--;

cout << "b : " << sum << endl;

}

}

}

 

해결되었습니다!!^^

 

GODOT님의 프로필 이미지
GODOT

작성한 질문수

질문하기