인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

padohy님의 프로필 이미지

작성한 질문수

[Level 1] Qt를 이용한 Python 프로그래밍: 입문편

Re-entrancy를 만족하는 Thread 예제 구현 Part 2

mutex, incNumber는 global 안붙여도 되는건가요?

작성

·

52

1

Re-entrancy를 만족하는 Thread 예제 구현 Part2 를 듣는중에 갑자기 mutex, incNumber는 global 안붙여도 제대로 동작하길래 무슨 원리일까요?

답변 2

1

김대진님의 프로필 이미지
김대진
지식공유자

global 없이도 잘 동작하는 경우가 있다?

네, 이건 두 가지 이유 중 하나 때문입니다:

① 이미 global이 코드에 명시되어 있다

→ 예제 소스코드상에 global numUsed가 Producer와 Consumer 둘 다에 들어 있습니다.

global numUsed

위의 코드가 이미 선언되어 있음

그래서 당연히 에러 없이 잘 동작합니다.

만약 이걸 빼면 어떻게 될까요?

② global을 빼면 실제로 에러가 발생한다

예를 들어 아래처럼 Producer에서 global numUsed를 뺐다고 가정하면:

class Producer(QThread):

def run(self):

for i in range(10):

time.sleep(1)

mutex.lock()

numUsed += 1 # 여기가 에러 발생

incNumber.wakeAll()

mutex.unlock()

실행하면 아래와 같은 에러가 뜹니다:

UnboundLocalError: cannot access local variable 'numUsed' where it is not associated with a value

즉, 정상적인 Python 동작에서는 반드시 global numUsed가 필요합니다.

 

혹시 더 궁금한게 있으면 언제든 질문해 주세요.

감사합니다. 김대진 드림.

 

 

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. padohy님.

Qt 관련 강의를 수강하시면서 쓰레드 및 동기화 문제와 관련하여 궁금한 점이 있으시군요. mutexincNumber가 전역 변수로 선언되지 않았는데도 올바르게 작동하는 이유에 대해 설명드리겠습니다.

Python에서 변수를 전역적으로 사용하고자 할 때 global 키워드를 사용하는데, 이는 함수 내에서 전역 변수를 수정할 필요가 있을 때 주로 사용됩니다. 그러나 mutexincNumber의 경우, 일반적으로 해당 변수가 함수 바깥에서 이미 정의된 상태라면, 읽기 전용으로 사용할 때 global 키워드를 사용하지 않아도 됩니다.

  1. Global 변수 접근: 어떤 변수든 함수 밖에서 초기화되고 읽기만 하는 경우에는 자동으로 그 변수를 가져와서 사용할 수 있습니다. 즉, 읽기 전용으로 변수를 사용하는 경우에는 global 키워드가 필요하지 않습니다.

  2. Global 변수 수정: 반면, 함수 내에서 전역 변수를 수정해야 할 경우에만 global 키워드가 필요합니다. 만약 함수 내에서 mutexincNumber를 수정하고 있다면, 이 경우에 global을 명시해야 합니다.

관련 내용의 예시나 코드 포맷에 대한 설명은 Qt 프로그래밍 환경을 설정할 때 공통으로 나타날 수 있는 상황입니다.

유사한 질문과 관련된 이전 답변들이 도움이 될 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

padohy님의 프로필 이미지

작성한 질문수

질문하기