2012-03-08 3 views
3

스레드 모듈과 함께 파이썬 코드에 2 개의 스레드와 하나의 전역 변수가 있다고합시다. 이 코드에서는 thread-1 만 전역 변수의 값을 수정하지만 thread-2는 전역 변수의 값을 읽고 해당 값에 따라 작업을 수행합니다.파이썬 스레딩 모듈 아래에 전역 변수 잠그기

이 상황에서 Lock()을 사용하여 전역 변수에 대한 액세스를 보호해야합니까? C에서는 이러한 조건에서 뮤텍스를 사용해야합니다. 그러나, GIL과 파이썬은 어떨까요? 아직도 그렇습니까? Lock()이 여전히 필요합니까?

답변

8

개체 변수를 전역 변수에 할당하는 것은 파이썬에서 원자 연산입니다. 다른 스레드는 할당되는 동안 변수를 읽음으로써 변수를 잘못 읽을 수 없습니다. GIL은 Python의 C 구현에서 이것을 보장하지만, 다른 구현은 다른 방식으로 동일한 보증을 할 수 있고 할 수 있습니다.

전역 변수가 목록과 같이 변경 가능한 개체이고 해당 개체를 수정하는 경우 사용하는 방법에 따라 다릅니다. 리스트와 같은 내장 객체의 대부분의 메소드는 원자 적입니다.

그러나 변수의 용도와 사용 방법에 대해 자세히 알지 못해도 잠금이 필요 없다는 것을 말할 수는 없습니다. thread-2가 그 값을 기반으로 동작을 변경해야하는 이유는 무엇이며 thread-2가 thread-2가 결정을 내린 직후에 thread-1이 값을 변경하면 괜찮습니까? OK가 아니라면 여전히 자물쇠가 필요할 수 있습니다.

(C에서 유사한 상황 - - 포인터 변수에 값을 할당이. 포인터 할당이 재정렬 될 수 있지만 사용자가 C.의 잠금을 방지하기 위해 일부 환경에서이를 사용하여도 정상적인 상황 원자이다)