2017-04-14 1 views
1

제목이 붙은 것처럼 하나의 변수에 액세스하는 여러 스레드와 하나의 스레드 만 변수를 변경하고 다른 모든 스레드는 변수의 값을 읽습니다.전역 변수로 멀티 스레딩 : 하나의 스레드 만 변수를 변경하는 경우 변수를 잠글 필요가 있습니까?

스레드 1 :

while True: 
    a += 1 

스레드 2, 3, 4, ...이 마찬가지로이 경우

print a 

만 스레드 1 가변 a을 변화 . 심각한 문제가 발생합니까?

나는 비슷한 C/C++는 " in which cases do I need to lock a variable from simultaneous access?"라는 질문에 태그를 발견, 그리고 내가 걱정해야 할 유일한 것은 다른 스레드에서 획득 한 a가 업데이트되지 않을 수 있습니다로한다는 것을, 대답에서 보인다.

내가 최신 값을 얻지 못할 수도 있다는 것을 제외하고는 액세스하는 동안 변수를 잠그지 않으면 더 심각한 문제가 발생하고 코드가 손상 될 수 있습니까?

나는 이것이 언어와 관련이 있다고 생각하지 않지만, 문제가된다면, 나는 특별히 파이썬의 경우에 관심이있다.

+3

특정 변수에 대해 경쟁 조건이 발생할 수없는 한 해당 변수를 잠글 필요가 없습니다. –

+0

문제가 없습니다. 각 스레드는 읽은 시점에서 최신 값을 가져옵니다. – tdelaney

+0

@JacobG. 정수는 파이썬에서 불변이다. 'a + = 1' 문은 새로운 정수를 만들고 그것을 참조하기 위해'a '를 변경합니다. –

답변

1

일반적으로 말하자면, 문제는 다른 스레드가 잘못된 값을 얻는 결과에 어떤 영향을 미치는지에 달려 있습니다.

답변은 실제로 컴퓨터 언어와 관련이 있습니다. Race condition에 대한 일반적인 위키 백과 문서의 Software section을 참조하십시오.

관련하여 "GIL"덕택에 파이썬 프로그램의 대부분은 인터프리터가 스레드로부터 안전하지 않기 때문에 실제 멀티 스레딩을 수행하지 않습니다.

+0

이것은 파이썬이 GIL을 가지고 있기 때문에 파이썬이 이런 식으로 작동하는 것이 안전하다는 것을 의미합니까? 어쨌든 디폴트로 변수를 잠그기 때문입니다. – beedrill

+0

@beedrill : 간단한 예제 코드에서 yes. 그러나 GIL은 업데이트 프로세스 중에 릴리스되어 다시 획득 될 수 있기 때문에 더 복잡한 유형을 업데이트하지 못할 수도 있습니다. 동시 접근 문제를 막기 위해'threading.Lock'을 생성하고 사용하는 것은 파이썬에서 매우 쉽습니다. 즉 :'with my_lock : '은 잠금을 먼저 획득하고 다음 명령문이 실행 된 후에 잠금을 해제합니다. – martineau

-2

언어와 관계없이 두 개의 별도 스레드로 변수를 업데이트하면 값에 영향을줍니다. 그러나 값을 인쇄 할 수는 없습니다. 유일한 문제는 모든 스레드 (2 개 이상)가 다른 값을 인쇄한다는 것입니다.

데이터베이스에서이 현상이 발생했다고 생각하십시오. 한 사람이 dB를 업데이트 할 수 있지만 많은 사람들이 읽을 수 있습니다.

+2

사실이 아닙니다. 예를 들어'a + = 1'이 다음과 같이 구현되었다고 상상해보십시오 : 1)'a'의 값을 저장하십시오. 2)'a' 객체를 파괴합니다. 3) 저장 한 값에 1을 더한 값으로 새로운 정수형 객체를 만듭니다. 4)'a'가 그 새로운 객체를 참조하도록합니다. - 다른 스레드가 1 단계 후 4 단계 이전에'a' 값에 액세스하려고하면 어떻게됩니까? –

+0

이것은 언어가 구현되는 방식이 아닙니다. a + = 1은 다음과 같이 작동합니다. a의 값이 프로세서의 레지스터에 복사됩니다. 1 씩 증가하고 a가 갱신됩니다. a는 컴퓨터의 주 메모리에 있습니다. 레지스터 수준에서 증가가 발생합니다. 레지스터 값은 a의 메모리 위치에 다시 기록됩니다. 다른 스레드가이 3 단계 사이에서 a의 값에 액세스하면 a의 이전 값을 가져옵니다. 다른 읽기 스레드는 a의 값을 변경할 수 없습니다. 당신이 주장한대로 어떤 것도 "파괴"되지 않습니다 – narasimman

+0

그런 식으로 구현 된 언어가 있습니까? 아니면 모든 언어가 그런 식으로 구현된다는 보장이 있습니까? 전자의 경우, 그것에 의존하는 것이 미친가요? 후자의 경우, 어디에서 그런 경이로운 광범위한 보증을 찾을 수 있습니까? (그리고 모든 시간 동안 모든 컴퓨터에 레지스터가 있다는 것을 어떻게 알 수 있습니까? 아니면 사용자가 CPU를 업그레이드 할 때 실패 할 수있는 코드를 작성하는 것이 좋습니까?) –

관련 문제