작성
·
236
0
32:55초
28째줄 (jobtimer.cpp 궁금한게 있습니다.)
28번째 줄에 WRITE_LOCK 하기전에 중괄호를 쳤는데
어떤 상황에 의해 LOCK 잡은 곳(괄호)을 지나서
그 괄호 밖의 for문이 실행될 수 있다는 말인가요?
그래서 _distributing 으로 막는거라 이해 하면 되는건가요?
괄호가 없음 상관이 없을까요?
답변 1
1
멀티쓰레드 환경이라면 같은 함수를
여러 쓰레드가 막 동시에 호출할 수도 있는데요.
어떤 쓰레드에서 함수 흐름대로 쭉 실행해서 LOCK을 지나치게 아래부분을 실행하는데
다른 쓰레드가 동시에 실행되면 LOCK 관련 부분을 실행하고 있을 수 있겠죠.
전체 LOCK을 잡으면 이 문제는 해결되지만
대신 한 애가 실행할 때 다른 애들은 아예 실행을 못하고 대기하게 됩니다.
아 제가 궁금한점이 { } 괄호를 기준으로 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;
}
}
}
해결되었습니다!!^^